как установить фрагмент по умолчанию во время выполнения в панели навигации, созданной Android Studio

#java #android #android-fragments #navigation-drawer #android-architecture-navigation

#java #Android #android-фрагменты #навигация-панель #android-архитектура-навигация

Вопрос:

Ниже приведен MainActivity класс, созданный активностью панели навигации Android Studio, который содержит 3 фрагмента с именами home, gallery и slideshow, и как я могу изменить фрагмент по умолчанию во время выполнения

 public class MainActivity extends AppCompatActivity {

  private AppBarConfiguration mAppBarConfiguration;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = findViewById(R.id.fab);
        DrawerLayout drawer = findViewById(R.id.drawer_layout);
        NavigationView navigationView = findViewById(R.id.nav_view);

        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();

            }
        });

        // Passing each menu ID as a set of Ids because each
        // menu should be considered as top level destinations.
        mAppBarConfiguration = new AppBarConfiguration.Builder(R.id.nav_gallery, R.id.nav_slideshow,R.id.nav_home)
                .setDrawerLayout(drawer)
                .build();
        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
        NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
        NavigationUI.setupWithNavController(navigationView, navController);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onSupportNavigateUp() {
        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
        return NavigationUI.navigateUp(navController, mAppBarConfiguration)
                || super.onSupportNavigateUp();
    }
}
 

Комментарии:

1. Почему вы пытаетесь изменить фрагмент по умолчанию во время выполнения?

Ответ №1:

Первоначально первый / фрагмент по умолчанию (начальный пункт назначения) должен быть установлен в атрибуте navGraph using app:startDestination , иначе вы получите RuntimeException значение of android.view.InflateException: Binary XML file line #10: Error inflating class fragment .

Итак, ответ на ваш вопрос: вы не можете установить фрагмент по умолчанию программно, потому что сначала вы должны установить его в xml. Но что вы можете сделать, это перейти от фрагмента по умолчанию startDestination к другому целевому фрагменту в onCreate() методе, прежде чем фрагмент по умолчанию будет показан пользователю.

NavController Отвечает за навигацию между местами назначения фрагментов в navGraph .

В классе есть несколько перегруженных версий navigate() метода NavController , которые позволяют перемещаться между фрагментами.

Например, чтобы установить транзакцию для фрагмента галереи, вы можете передать его идентификатор navigate() методу

 protected void onCreate(Bundle savedInstanceState) {
    ...
    NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
    navController.navigate(R.id.nav_gallery);
...
 

Ответ №2:

Это можно сделать с помощью mobile_navigation.xml файл :

 <navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@ id/mobile_navigation2"
app:startDestination="@ id/nav_home">
 

Вы можете изменить назначение, изменив приложение:startDestination , в данном случае оно начинается с nav_home .