[Android]BottomNavigationでページを切り替えたときにviewの内容を保存したい


課題


androidのBottomNavigationを使用したアプリを作っている。ページを移動して戻って来た時にTextViewなどに書き込んだデータを保存しておきたい。



問題点


通常ActivityやFragmentを離れて戻って来た時にviewの内容などを保存したいときはonSaveInstanceState()でBundleにデータを保存し、戻って来た時にonCreateView()などで再度値をセットする、という手法をとる。しかし、BottomNavigationによるページの切り替えの際はonSaveInstanceState()は呼ばれない。



対策


BottomNavigationを実装しているActivity(今回はMainActivity)内に値を保持する用のpublic変数を定義する。各FragmentのonPause()でこのpublic変数に値をセットする処理を入れ、戻って来たときはこのpublic変数から値を取り出せばよい。


MainActivity.java

public class MainActivity extends AppCompatActivity {

    public static Bundle args;
    
    public static Bundle get_args(){
        return args;
    }
    
    public static void setArgs(Bundle args_in){
        args=args_in;
    }
}

Fragment.java

public void onPause() {
    
    Bundle args;  
    //argsにデータを入れる処理
    
    MainActivity.setArgs(args);    
    super.onPause();
}

public View onCreateView(@NonNull LayoutInflater inflater,
                         ViewGroup container, Bundle savedInstanceState) {

    Bundle args=MainActivity.get_args();                         
    //argsからviewにデータをセットする処理
}

ただし、このように複数のモジュールからアクセスできるpublic変数に値を持たせることは本当は良くない。BottomNavigationをカスタマイズして対応するのが一番本質的な解法らしいが、相当大変そうだったので今回は妥協してしまった、、、

最新記事

すべて表示

現象 SQLiteDataBaseをContentProviderで読み取ってRecyclerViewに一覧表示している。データベースの内容を更新してもそれがRecyclerViewに反映されない。 原因 ContentProviderのquery()メソッドでsetNotificationUri()メソッドを呼び出していなかった。 このメソッドでcursorにデータのuriが紐づけられ、Curs

現象 データベースからデータを読み取ってRecyclerViewで一覧表示をしたい。データベースには複数登録されているはずなのに、RecyclerViewには1つしか表示されない。前回と違い、RecyclerView.AdapterのgetItemCount()は適切に設定されている。 原因 個々のviewをxmlファイルで定義して、コンストラクタのnewViewメソッドでinflateしている。

靴を大切にしよう!靴管理アプリ SHOES_KEEP

納品:iPhone6.5①.png

靴の履いた回数、お手入れ回数を管理するアプリです。

google-play-badge.png
Download_on_the_App_Store_Badge_JP_RGB_blk_100317.png

テーマ日記:テーマを決めてジャンルごとに記録

訂正①2040×1152.jpg

ジャンルごとにテーマ、サブテーマをつけて投稿、記録できる日記アプリです。

google-play-badge.png