質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

2回答

2325閲覧

(Android)アプリの戻るボタンを押したら前の画面に戻る様にしたい

komon4242

総合スコア21

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2017/10/19 05:41

編集2017/10/19 06:54

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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

MainActivityの中身を変更するのではなく、
新しいMainActivityを上に重ねていく形にするのはどうでしょうか。

MainActivityのonCreateでIntentを確認して、
パスが入っていたら、外部ストレージパスの代わりに指定されたパスのリストを表示する。
階層潜るときはIntentにパスを詰めて新しいMainActivityをスタートする。

投稿2017/10/19 06:14

abs123

総合スコア1280

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

komon4242

2017/10/19 06:25

それはFragmentと言うやつでしょうか?(ごめんなさいよく分かってないです) Activityを重ねれば最後のアクティビティまでアプリが終了される事は無いですね。
abs123

2017/10/19 06:57

いいえ、普通のActivityで出来るはずです。 ちょっと短絡的すぎたかなって感じもしてます。 ツールバーとか付け加えてファイルコピーとかするのであれば、 Fragmentでやったほうがいいんだろうなぁ・・・ Fragment使うならyonaさん案のonBackPressedを使うことになると思います。 FragmentManagerのBackStackを利用したら案外簡単に実装できるのかなって感じがします。 (私自身Fragmentあまり使ったことないので何も言えないです。)
komon4242

2017/10/19 23:55

回答ありがとうございます。 実装出来たyanaさんの方をベストアンサーにしましたが、 abs123さんの解決方も対応してみます。 あの後機能を追加したらまたエラーが出たので再度別件で質問するかもしれません。 その時はまた助言してください。 本当にありがとうございました。
guest

0

ベストアンサー

Activity#onBackPressedでバックキーのタップを検知してください。

投稿2017/10/19 05:48

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

komon4242

2017/10/19 06:29

ありがとうございます。 onBackPressedで戻るボタンを押した時の処理を追加すると勝手に落ちる事はなくなりました。 ですが処理的には少し難しくなりました。 具体的に言いますと、戻るボタンを押した時の自分の階層がわからないのです。 取りあえずfill()にold_pathを追加してバックボタンを押した時にold_pathがトップ(/storage/emulated/0)と同じ場合は処理を終了すると言う処理で何とかなりそうです。ありがとございました
hiramekun

2017/10/19 11:44

解決していると思われるので、ベストアンサーにして解決済にしてください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問