android studioのデフォルトで用意されているNavigation Drawer Activityを改造してアプリを作っているのですが、navigationViewでHOME→galally→HOMEなどと一度別のfragmentを経由して表示した場合は問題ないのですが、NavigationViewでHOME→HOMEと選び同じフラグメントに遷移するとHomeFragmentに書いたHandler内でのviewの更新がされなくなったり一部挙動がおかしくなってしまいます。
単純な解決方法としては
1.NavigationViewで表示しているアイテムと同じアイテムを選択したら何もしない
2.一度fragmentのインスタンスが生成されていたら再生成しない
上記二つ思いついたのですが、解決方法として正しいのかどうか。
そして実装上どのようにすれば実現できるか知りたいです。
1.の解決方法はデフォルトのテンプレートで各アイテムがfragmentタグでxmlに埋め込まれいるので難しいような気がしています。
補足
動きを見てみましたが
2回目に同じアイテムをタップした場合、新たに生成しようとonCreateが走ったあとすぐに最初に動いていたものを終了しようとonDestroyが走ってしまっています。
これは単純に上記の方法で解決できるのだろうか・・・
1.案で解決できそうですが、表示しているフラグメントと同じアイテム選択時は何も処理しないとかできますか?
静的なfragmentなのでもしかして大幅につくりかえないと駄目でしょうか?
MainActivity.java
java
1import android.Manifest; 2import android.content.Intent; 3import android.content.pm.PackageManager; 4import android.os.Bundle; 5 6import com.google.android.material.floatingactionbutton.FloatingActionButton; 7import com.google.android.material.snackbar.Snackbar; 8 9import android.view.MenuItem; 10import android.view.View; 11 12import androidx.annotation.NonNull; 13import androidx.core.app.ActivityCompat; 14import androidx.core.content.ContextCompat; 15import androidx.navigation.NavController; 16import androidx.navigation.Navigation; 17import androidx.navigation.ui.AppBarConfiguration; 18import androidx.navigation.ui.NavigationUI; 19 20import com.google.android.material.navigation.NavigationView; 21 22import androidx.drawerlayout.widget.DrawerLayout; 23 24import androidx.appcompat.app.AppCompatActivity; 25import androidx.appcompat.widget.Toolbar; 26 27import android.view.Menu; 28 29public class MainActivity extends AppCompatActivity { 30 31 private AppBarConfiguration mAppBarConfiguration; 32 33 @Override 34 protected void onCreate(Bundle savedInstanceState) { 35 super.onCreate(savedInstanceState); 36 setContentView(R.layout.activity_main); 37 Toolbar toolbar = findViewById(R.id.toolbar); 38 setSupportActionBar(toolbar); 39 FloatingActionButton fab = findViewById(R.id.fab); 40 fab.setOnClickListener(new View.OnClickListener() { 41 @Override 42 public void onClick(View view) { 43 Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 44 .setAction("Action", null).show(); 45 } 46 }); 47 DrawerLayout drawer = findViewById(R.id.drawer_layout); 48 NavigationView navigationView = findViewById(R.id.nav_view); 49 50 // Passing each menu ID as a set of Ids because each 51 // menu should be considered as top level destinations. 52 mAppBarConfiguration = new AppBarConfiguration.Builder( 53 R.id.nav_home, R.id.nav_graph, R.id.nav_slideshow, 54 R.id.nav_tools, R.id.nav_share, R.id.nav_send) 55 .setDrawerLayout(drawer) 56 .build(); 57 NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment); 58 NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration); 59 NavigationUI.setupWithNavController(navigationView, navController); 60 } 61 62 @Override 63 public boolean onCreateOptionsMenu(Menu menu) { 64 // Inflate the menu; this adds items to the action bar if it is present. 65 getMenuInflater().inflate(R.menu.main, menu); 66 return true; 67 } 68 69 @Override 70 public boolean onSupportNavigateUp() { 71 NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment); 72 return NavigationUI.navigateUp(navController, mAppBarConfiguration) 73 || super.onSupportNavigateUp(); 74 } 75 76 @Override 77 protected void onDestroy() 78 { 79 super.onDestroy(); 80 } 81}
mobile_navigation.xml
XML
1<?xml version="1.0" encoding="utf-8"?> 2<navigation xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:id="@+id/mobile_navigation" 6 app:startDestination="@+id/nav_home"> 7 8 <fragment 9 android:id="@+id/nav_home" 10 android:name="XXX.ui.home.HomeFragment" 11 android:label="@string/menu_home" 12 tools:layout="@layout/fragment_home" /> 13 14 <fragment 15 android:id="@+id/nav_graph" 16 android:name="XXX.ui.graph.GraphFragment" 17 android:label="@string/menu_graph" 18 tools:layout="@layout/fragment_graph" /> 19 20 <fragment 21 android:id="@+id/nav_slideshow" 22 android:name="xxx.ui.slideshow.SlideshowFragment" 23 android:label="@string/menu_slideshow" 24 tools:layout="@layout/fragment_slideshow" /> 25 26 <fragment 27 android:id="@+id/nav_tools" 28 android:name="xxx.ui.tools.ToolsFragment" 29 android:label="@string/menu_tools" 30 tools:layout="@layout/fragment_tools" /> 31 32 <fragment 33 android:id="@+id/nav_share" 34 android:name="xxx.ui.share.ShareFragment" 35 android:label="@string/menu_share" 36 tools:layout="@layout/fragment_share" /> 37 38 <fragment 39 android:id="@+id/nav_send" 40 android:name="xxx.ui.send.SendFragment" 41 android:label="@string/menu_send" 42 tools:layout="@layout/fragment_send" /> 43</navigation>
回答1件
あなたの回答
tips
プレビュー