top of page

[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をカスタマイズして対応するのが一番本質的な解法らしいが、相当大変そうだったので今回は妥協してしまった、、、

最新記事

すべて表示

【Android】Android APIレベルとは

はじめに google play storeにアプリをアップロードしようとしたら下記のエラーが発生 現在、お客様のアプリは API レベル 31 を対象にしています。セキュリティとパフォーマンスが最適化された最新の API を利用するには、API レベル 33...

[Android]SQLiteDataBaseの更新がviewに反映されない

現象 SQLiteDataBaseをContentProviderで読み取ってRecyclerViewに一覧表示している。データベースの内容を更新してもそれがRecyclerViewに反映されない。 原因 ContentProviderのquery()メソッドでsetNot...

Comments


カテゴリ

あなたの買い物をサポートする
アプリ Shop Plan

iphone6.5p2.png

​いつ何を買うかの計画を立てられるアプリです。

google-play-badge.png
Download_on_the_App_Store_Badge_JP_RGB_blk_100317.png

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

納品:iPhone6.5①.png

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

google-play-badge.png
Download_on_the_App_Store_Badge_JP_RGB_blk_100317.png

「後で読む」を忘れないアプリ ArticleReminder

気になった​Webサイトを登録し、指定時刻にリマインダを送れるアプリです

google-play-badge.png
Download_on_the_App_Store_Badge_JP_RGB_blk_100317.png
bottom of page