java - 从抽屉导航启动 fragment 会导致应用程序崩溃

标签 java android android-fragments

正如问题所述,我正在尝试从 Android Studio 预构建的抽屉导航模板启动一个 fragment 。

我尝试在这里关注这个家伙的视频 https://www.youtube.com/watch?v=H4R-hz56oBA 。在测试过程中,有时他的方法可以工作,有时则不行,但是,我总是使用相同的代码。

public boolean onNavigationItemSelected(MenuItem item) {
    // Handle navigation view item clicks here.
    int id = item.getItemId();

    if (id == R.id.nav_home) {
        // Handle the camera action
    } else if (id == R.id.nav_gallery) {
        Facebook facebookFrag = new Facebook();
        FragmentManager manager = getSupportFragmentManager();
       manager.beginTransaction().replace(R.id.homeLanding,facebookFrag,facebookFrag.getTag()).commit();

    } else if (id == R.id.nav_slideshow) {

    } else if (id == R.id.nav_tools) {

    } else if (id == R.id.nav_share) {

    } else if (id == R.id.nav_send) {

    }

    DrawerLayout drawer = findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
    return true;
}

理论上,当在抽屉导航中单击项目 Gallery 时,名为 Facebook 的 fragment 将取代我名为 homeLanding 的默认 fragment 。有什么想法吗?

更新:看起来我需要在 MainActivity 中实现 OnFragmentInteractionListener。

cyclic inheritance involving

解决了我的问题

最佳答案

我使用这段代码,我的抽屉是一个全局变量:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        drawer = findViewById(R.id.drawer_layout);
        NavigationView navigationView = findViewById(R.id.nav_view);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.addDrawerListener(toggle);
        toggle.syncState();
        navigationView.setNavigationItemSelectedListener(this);

        //Use this code to set the starting fragment:
        if(savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction().replace(R.id.fragments_container,
                    new VendasFragment()).commit();
            navigationView.setCheckedItem(R.id.nav_vendas);
            getSupportActionBar().setTitle(R.string.menu_vendas);
        }
    }


@Override
        public boolean onNavigationItemSelected(MenuItem item) {
            // Handle navigation view item clicks here.
            switch (item.getItemId()){

                case (R.id.nav_vendas):
                    getSupportFragmentManager().beginTransaction().replace(R.id.fragments_container,
                            new VendasFragment()).commit();
                    getSupportActionBar().setTitle(R.string.menu_vendas);
                    break;

                case (R.id.nav_clientes):
                    getSupportFragmentManager().beginTransaction().replace(R.id.fragments_container,
                            new ClienteFragment()).commit();
                    getSupportActionBar().setTitle(R.string.menu_clientes);
                    break;

                case (R.id.nav_estoque):
                    getSupportFragmentManager().beginTransaction().replace(R.id.fragments_container,
                            new EstoqueFragment()).commit();
                    getSupportActionBar().setTitle(R.string.menu_estoque);
                    break;

                case (R.id.nav_estatistica):
                    getSupportFragmentManager().beginTransaction().replace(R.id.fragments_container,
                            new EstatisticaFragment()).commit();
                    getSupportActionBar().setTitle(R.string.menu_estatistica);
                    break;

                case (R.id.nav_fornecedores):
                    getSupportFragmentManager().beginTransaction().replace(R.id.fragments_container,
                            new FornecedorFragment()).commit();
                    getSupportActionBar().setTitle(R.string.menu_fornecedores);
                    break;

                case (R.id.nav_backup):
                    getSupportFragmentManager().beginTransaction().replace(R.id.fragments_container,
                            new BackupFragment()).commit();
                    getSupportActionBar().setTitle(R.string.menu_backup);
                    break;

                case (R.id.nav_config):
                    break;

                case (R.id.nav_conta_receber):
                    getSupportFragmentManager().beginTransaction().replace(R.id.fragments_container,
                            new ContasReceberFragment()).commit();
                    getSupportActionBar().setTitle(R.string.menu_contas_receber);
                    break;

                case (R.id.nav_contas_pagar):
                    getSupportFragmentManager().beginTransaction().replace(R.id.fragments_container,
                            new ContasPagarFragment()).commit();
                    getSupportActionBar().setTitle(R.string.menu_contas_pagar);
                    break;
            }

            drawer = findViewById(R.id.drawer_layout);
            drawer.closeDrawer(GravityCompat.START);
            return true;
        }

关于java - 从抽屉导航启动 fragment 会导致应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56515591/

相关文章:

java - 在 Java 中通过循环创建乘法表

android - 安卓上的图标计数器

android - 异步任务崩溃 ViewPager RecyclerView (Android)

java - Android : Package has already posted 50 toasts. 不显示更多。

java - Jsoup HTTPS 连接

java - JButton 定位问题

java - 如何对已在 onCreate() 方法中创建的 View 使用 dagger 依赖注入(inject)

android - 启用 Google Play App Signing 后 Gmail 登录不起作用

android - 在 app.json 中定义 expo entryPoint 不起作用

android - 从另一个 Activity 中打开一个 Activity 的 fragment