[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している。