You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Fragment Activity报错求助,附代码及错误截图

Fragment Activity导航切换Fragment异常问题修复

问题描述

使用带侧滑导航的Fragment Activity时,点击不同导航项无法切换到对应的Fragment,代码运行存在逻辑错误。

原代码(存在问题)

import android.os.Bundle;
import android.view.MenuItem;

import com.google.android.material.navigation.NavigationView;

public class Home extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
    private DrawerLayout drawer;

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

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

        drawer = findViewById(R.id.drawer_layout);
        NavigationView navigationView = findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);

        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar,
                R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.addDrawerListener(toggle);
        toggle.syncState();

        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                    new BlogsFragment()).commit();
            navigationView.setCheckedItem(R.id.blogs);
        }
    }

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()) {
            case R.id.blogs:
                getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                        new BlogsFragment()).commit();
                break;
            case R.id.blogs:
                getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                        new MedsFragment()).commit();
                break;
            case R.id.blogs:
                getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                        new AboutFragment()).commit();
                break;
        }

        drawer.closeDrawer(GravityCompat.START);
        return true;
    }

    @Override
    public void onBackPressed() {
        if (drawer.isDrawerOpen(GravityCompat.START)){
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }
}

错误分析

  1. 导航项ID重复:onNavigationItemSelected方法中三个case分支都使用了R.id.blogs,导致无论点击哪个导航项,只会加载BlogsFragment,MedsFragment和AboutFragment永远不会被触发。
  2. 缺失必要导入:代码未导入Toolbar、DrawerLayout、ActionBarDrawerToggle、GravityCompat等类,会引发编译错误。

修复方案

1. 补充必要导入语句

在代码顶部添加以下导入(根据项目依赖的AndroidX或support库调整):

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.appcompat.app.ActionBarDrawerToggle;
import android.view.Gravity;

2. 修正导航项ID判断

将onNavigationItemSelected中的case分支修改为对应导航项的正确ID,示例如下:

@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
    switch (item.getItemId()) {
        case R.id.blogs:
            getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                    new BlogsFragment()).commit();
            break;
        case R.id.meds: // 替换为导航菜单中"药品"对应的ID
            getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                    new MedsFragment()).commit();
            break;
        case R.id.about: // 替换为导航菜单中"关于"对应的ID
            getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                    new AboutFragment()).commit();
            break;
    }

    drawer.closeDrawer(GravityCompat.START);
    return true;
}

3. 验证导航菜单ID一致性

确保res/menu/目录下的导航菜单XML文件中,各item的android:id与代码中使用的ID完全匹配,示例导航菜单:

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/blogs"
        android:title="博客"/>
    <item
        android:id="@+id/meds"
        android:title="药品"/>
    <item
        android:id="@+id/about"
        android:title="关于"/>
</menu>

内容的提问来源于stack exchange,提问作者Khushi Sapkal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 13:45:32