Symfoware

Symfowareについての考察blog

android FragmentTransaction.addToBackStackでスタックした情報をクリアする

前の画面に戻る機能は、FragmentTransactionのaddToBackStackを使用すると
簡単に実装できます。

Android 横にスライドしてFragmentを切り替える


積み上げたスタックの情報を消去(clear)したかったのですが、
やり方がわからず。


スタックの初期化



こちらが参考になりました。
Clear back stack using fragments

1つ前のスタックを消すことはやったことたあるのですが、
Android 戻るボタンを押した時、積み上げたBackStackを1つ飛ばした画面に戻りたい
これと同様、スタックがなくなるまで前に戻ればOKです。


サンプルはこんな感じになりました。

・activity_main.xml


  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout
  3.     xmlns:android="http://schemas.android.com/apk/res/android"
  4.     xmlns:app="http://schemas.android.com/apk/res-auto"
  5.     xmlns:tools="http://schemas.android.com/tools"
  6.     android:orientation="vertical"
  7.     android:layout_width="match_parent"
  8.     android:layout_height="match_parent"
  9.     tools:context="com.example.baranche.myapplication.MainActivity">
  10.     <LinearLayout
  11.         android:orientation="horizontal"
  12.         android:layout_width="match_parent"
  13.         android:layout_height="wrap_content">
  14.         <Button
  15.             android:id="@+id/button"
  16.             android:layout_width="wrap_content"
  17.             android:layout_height="wrap_content"
  18.             android:text="Add"
  19.             android:onClick="click"
  20.             />
  21.         <Button
  22.             android:id="@+id/button2"
  23.             android:layout_width="wrap_content"
  24.             android:layout_height="wrap_content"
  25.             android:text="Clear"
  26.             android:onClick="clear"
  27.             />
  28.     </LinearLayout>
  29.     <LinearLayout
  30.         android:id="@+id/content"
  31.         android:orientation="vertical"
  32.         android:layout_width="match_parent"
  33.         android:layout_height="match_parent" />
  34. </LinearLayout>




・fragment.xml


  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout
  3.     xmlns:android="http://schemas.android.com/apk/res/android"
  4.     android:orientation="vertical"
  5.     android:layout_width="match_parent"
  6.     android:layout_height="match_parent"
  7.     >
  8.     <TextView
  9.         android:id="@+id/textView"
  10.         android:layout_width="match_parent"
  11.         android:layout_height="match_parent"
  12.         android:textAlignment="center"
  13.         android:textSize="40sp"
  14.         android:text="TextView" />
  15. </LinearLayout>





・MainActivity.java


  1. import android.support.v4.app.Fragment;
  2. import android.support.v4.app.FragmentManager;
  3. import android.support.v4.app.FragmentTransaction;
  4. import android.support.v7.app.AppCompatActivity;
  5. import android.os.Bundle;
  6. import android.view.View;
  7. public class MainActivity extends AppCompatActivity {
  8.     private int mCount = 1;
  9.     @Override
  10.     protected void onCreate(Bundle savedInstanceState) {
  11.         super.onCreate(savedInstanceState);
  12.         setContentView(R.layout.activity_main);
  13.         addStack();
  14.     }
  15.     public void click(View view) {
  16.         addStack();
  17.     }
  18.     public void clear(View view) {
  19.         FragmentManager fragmentManager = getSupportFragmentManager();
  20.         int stackCount = fragmentManager.getBackStackEntryCount();
  21.         for(int i = 0; i < stackCount; ++i) {
  22.             fragmentManager.popBackStack();
  23.         }
  24.         mCount = 1;
  25.         addStack();
  26.     }
  27.     private void addStack() {
  28.         Fragment fragment = Fragment1.newInstance(mCount);
  29.         FragmentManager fragmentManager = getSupportFragmentManager();
  30.         final FragmentTransaction transaction = fragmentManager.beginTransaction();
  31.         // Fragmentを組み込む
  32.         transaction.replace(R.id.content, fragment);
  33.         // 初回表示以外の場合はスタックに追加
  34.         if (mCount != 1) {
  35.             transaction.addToBackStack(null);
  36.         }
  37.         // 上記の変更を反映する
  38.         transaction.commit();
  39.         mCount++;
  40.     }
  41. }




・Fragment1.java


  1. import android.os.Bundle;
  2. import android.support.v4.app.Fragment;
  3. import android.view.LayoutInflater;
  4. import android.view.View;
  5. import android.view.ViewGroup;
  6. import android.widget.TextView;
  7. public class Fragment1 extends Fragment {
  8.     private int mCount;
  9.     public static Fragment newInstance(int count) {
  10.         Fragment1 fragment = new Fragment1();
  11.         Bundle args = new Bundle();
  12.         args.putInt("COUNT", count);
  13.         fragment.setArguments(args);
  14.         return fragment;
  15.     }
  16.     @Override
  17.     public void onCreate(Bundle savedInstanceState) {
  18.         super.onCreate(savedInstanceState);
  19.         Bundle args = getArguments();
  20.         mCount = args.getInt("COUNT");
  21.     }
  22.     @Override
  23.     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
  24.         View view = inflater.inflate(R.layout.fragment, container, false);
  25.         TextView text = (TextView)view.findViewById(R.id.textView);
  26.         text.setText(String.format("Stack:%d", mCount));
  27.         return view;
  28.     }
  29. }





アプリ起動時

797_01.png


ADDでスタックを追加していきます。

797_02.png


CLEARでスタックを消去し初期化。
ここで戻るボタンを押すと、前のスタックは存在しないため、狙い通りアプリケーションが終了します。

797_03.png




POP_BACK_STACK_INCLUSIVE



FragmentManager.popBackStack(String name, FragmentManager.POP_BACK_STACK_INCLUSIVE)
これでもスタックを先頭に戻せるとのこと。
試してみます。


  1. import android.support.v4.app.Fragment;
  2. import android.support.v4.app.FragmentManager;
  3. import android.support.v4.app.FragmentTransaction;
  4. import android.support.v7.app.AppCompatActivity;
  5. import android.os.Bundle;
  6. import android.view.View;
  7. public class MainActivity extends AppCompatActivity {
  8.     private int mCount = 1;
  9.     @Override
  10.     protected void onCreate(Bundle savedInstanceState) {
  11.         super.onCreate(savedInstanceState);
  12.         setContentView(R.layout.activity_main);
  13.         addStack();
  14.     }
  15.     public void click(View view) {
  16.         addStack();
  17.     }
  18.     public void clear(View view) {
  19.         FragmentManager fragmentManager = getSupportFragmentManager();
  20.         /*
  21.         int stackCount = fragmentManager.getBackStackEntryCount();
  22.         for(int i = 0; i < stackCount; ++i) {
  23.             fragmentManager.popBackStack();
  24.         }
  25.         */
  26.         fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
  27.         mCount = 1;
  28.         addStack();
  29.     }
  30.     private void addStack() {
  31.         Fragment fragment = Fragment1.newInstance(mCount);
  32.         FragmentManager fragmentManager = getSupportFragmentManager();
  33.         final FragmentTransaction transaction = fragmentManager.beginTransaction();
  34.         // Fragmentを組み込む
  35.         transaction.replace(R.id.content, fragment);
  36.         // 初回表示以外の場合はスタックに追加
  37.         if (mCount != 1) {
  38.             transaction.addToBackStack(null);
  39.         }
  40.         // 上記の変更を反映する
  41.         transaction.commit();
  42.         mCount++;
  43.     }
  44. }




このコードでも同様の効果が得られました。

関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2017/09/12(火) 23:06:04|
  2. Java
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<android Fragmentを右から左にスライドアニメーションして入れ替える | ホーム | Ubuntu + Android Studioで実機をUSBに接続してデバッグ>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/2057-7054e455
この記事にトラックバックする(FC2ブログユーザー)