Android Studio 2.3でストレージ内のファイルをリストビューに表示するアプリを作りました。
以下の方法で取りあえず表示は出来たのですが、アプリの戻るボタンを押すとアプリが終了してしまいます。
望む動きとしては、フォルダの下層部に居る時は戻るボタンで上位層に戻って、
トップに戻った時に「アプリの戻るボタンを押す」とアプリが終了すると言う仕組みにしたいのですがどうしたらよいでしょうか?
googleやteratailで検索して調べようにも「Android 戻るボタン アプリ終了させない」などで調べても望む情報が得られません。
検索キーワードだけでも結構ですので教えて頂けませんでしょうか?
java
1 2/* import 省略 */ 3 4public class MainActivity extends AppCompatActivity implements AdapterView.OnItemClickListener { 5 6 private ListView listView; 7 private CustomAdapter adapter; 8 9 @Override 10 protected void onCreate(Bundle savedInstanceState) { 11 super.onCreate(savedInstanceState); 12 setContentView(R.layout.activity_main); 13 14 // リスト項目が選択された時のイベントを追加 15 listView = (ListView) findViewById(R.id.list_item); 16 listView.setOnItemClickListener(this); 17 18 // ファイルパスを取得 19 String path = Environment.getExternalStorageDirectory().getPath(); 20 fill(new File(path)); 21 } 22 23 // アクティビティ内の表示内容構築 24 private void fill(File fileDirectory) { 25 // タイトル 26 setTitle(fileDirectory.getAbsolutePath()); 27 28 readLocalStrage(fileDirectory.getPath()); 29 30 // ファイルリスト 31 File[] aFile = fileDirectory.listFiles(); 32 List<String> listString = new ArrayList<>(); 33 if (aFile != null) { 34 for (File fileTemp : aFile) { 35 listString.add(new aFile.getName()); 36 } 37 } 38 39 // 親フォルダに戻るパスの追加 40 if (fileDirectory.getParent() != null) { 41 listString.add(0, new String("..", new File(fileDirectory.getParent()))); 42 } 43 44 // リストビューに表示 45 adapter = new CustomAdapter(this, listString); 46 listView.setAdapter(adapter); 47 } 48 49 // リストをクリックした時の動作 50 @Override 51 public void onItemClick(AdapterView<?> parent, View view, int pos, long id) { 52 53 String String = adapter.getItem(pos); 54 if (String.getFile().isDirectory()) { 55 56 fill(String.getFile()); 57 } 58 }
java
1 2/* import省略 */ 3 4// リストビューのアダプタクラス 5public class CustomAdapter extends BaseAdapter { 6 7 private List<String> list; 8 9 LayoutInflater inflate; 10 11 public CustomAdapter(Context context, List<String> list){ 12 this.list = list; 13 inflate = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 14 mContentResolver = context.getContentResolver(); 15 } 16 17 18 @Override 19 public int getCount() { 20 return list.size(); 21 } 22 23 // Objectを明示的に指定するとキャスト不要 24 @Override 25 public String getItem(int pos) { 26 return list.get(pos); 27 } 28 29 @Override 30 public long getItemId(int pos) { 31 return pos; 32 } 33 34 @Override 35 public View getView(int pos, View convertView, ViewGroup parent) { 36 ViewHolder holder; 37 38 // 再利用できるViewがあるかどうか? 39 if(convertView == null){ 40 convertView = inflate.inflate(R.layout.detail_layout, parent, false); 41 42 holder = new ViewHolder(); 43 holder.icon = (ImageView) convertView.findViewById(R.id.imageView); 44 holder.name = (TextView) convertView.findViewById(R.id.textView); 45 convertView.setTag(holder); 46 }else { 47 holder = (ViewHolder) convertView.getTag(); 48 } 49 50 String item = getItem(pos); 51 52 if( item.getFile().isDirectory() ) 53 { // ディレクトリの場合は、名前の後ろに「/」を付ける 54 holder.name.setText( item.getName() + "/" ); 55 }else { 56 57 // ディレクトリじゃないじゃない場合 58 holder.name.setText(item.getName()); 59 } 60 return convertView; 61 } 62 63 static class ViewHolder { 64 ImageView icon; 65 TextView name; 66 } 67}
onBackPressed()を使った方法で修正してみました。
java
1 2/* import 省略 */ 3 4public class MainActivity extends AppCompatActivity implements AdapterView.OnItemClickListener { 5 6 private ListView listView; 7 private CustomAdapter adapter; 8 9 private String lastPath; // 追加 10 private String parentPath; // 追加 11 12 13 @Override 14 protected void onCreate(Bundle savedInstanceState) { 15 super.onCreate(savedInstanceState); 16 setContentView(R.layout.activity_main); 17 18 // リスト項目が選択された時のイベントを追加 19 listView = (ListView) findViewById(R.id.list_item); 20 listView.setOnItemClickListener(this); 21 22 // ファイルパスを取得 23 String path = Environment.getExternalStorageDirectory().getPath(); 24 lastPath = Environment.getExternalStorageDirectory().getParent(); // 追加 25 fill(new File(path)); 26 } 27 28 // アクティビティ内の表示内容構築 29 private void fill(File fileDirectory) { 30 // タイトル 31 setTitle(fileDirectory.getAbsolutePath()); 32 33 readLocalStrage(fileDirectory.getPath()); 34 35 // ファイルリスト 36 File[] aFile = fileDirectory.listFiles(); 37 List<String> listString = new ArrayList<>(); 38 if (aFile != null) { 39 for (File fileTemp : aFile) { 40 listString.add(new aFile.getName()); 41 } 42 } 43 44 parentPath = fileDirectory.getParent(); // 追加 45 // 親フォルダに戻るパスの追加 46 if (fileDirectory.getParent() != null) { 47 listString.add(0, new String("..", new File(fileDirectory.getParent()))); 48 } 49 50 // リストビューに表示 51 adapter = new CustomAdapter(this, listString); 52 listView.setAdapter(adapter); 53 } 54 55 // リストをクリックした時の動作 56 @Override 57 public void onItemClick(AdapterView<?> parent, View view, int pos, long id) { 58 59 String String = adapter.getItem(pos); 60 if (String.getFile().isDirectory()) { 61 62 fill(String.getFile()); 63 } 64 } 65 66 // 追加 67 @Override 68 public void onBackPressed(){ 69 if(parentPath.equals(lastPath)){ 70 // トップなら終了 71 super.onBackPressed(); 72 }else { 73 fill(new File(parentPath)); 74 } 75 76 } 77}

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/10/19 06:25
2017/10/19 06:57
2017/10/19 23:55