OnNavigationItemSelectedListener 开始 activity 而不是替换片段

OnNavigationItemSelectedListener starting activity instead of replacing fragment

我是编程新手,我正在使用 bottomNavigationView 创建一个应用程序。在我的 Welcome activity 中,我有我的 OnItemSelectedListener。但是当我 运行 android 设备中的应用程序和 select 一个选项时,它不会替换片段而是一次又一次地启动欢迎 Activity。

这是欢迎 activity,无论我 select 来自 BottonNavigationView 的哪个项目,它都会一直启动。

public class Welcome extends AppCompatActivity {
private Context mContext = Welcome.this;

private static final String TAG = "Welcome";
BottomNavigationViewEx bottomNav;
private List<ListItems> listItems;

@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_welcome);
    Log.d(TAG, "onCreate: starting");
    setupBottomNavigationView();
    Toast.makeText(this, "Starting", Toast.LENGTH_SHORT).show();

    enableNavigation();

    HomeFragment homeFragment = new HomeFragment();
    android.support.v4.app.FragmentManager manager = getSupportFragmentManager();
    manager.beginTransaction().replace(R.id.container, homeFragment).commit();

}

private void setupBottomNavigationView(){
    Log.d(TAG, "setupBottomNavigationView: setting bottomnavigationview");
    bottomNav = findViewById(R.id.nav_bottom);
    BottomNavigationViewHelper.setUpNavigationView(bottomNav);
}


private void enableNavigation(){
    bottomNav.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            switch(item.getItemId()){
                case R.id.btnHome:
                    bottomNav.setSelectedItemId(R.id.btnHome);
                    HomeFragment homeFragment = new HomeFragment();
                    android.support.v4.app.FragmentManager manager = getSupportFragmentManager();
                    manager.beginTransaction().replace(R.id.container, homeFragment).commit();
                    break;
                case R.id.btnChats:
                    bottomNav.setSelectedItemId(R.id.btnChats);
                    ChatsFragment chatsFragment = new ChatsFragment();
                    android.support.v4.app.FragmentManager manager1 = getSupportFragmentManager();
                    manager1.beginTransaction().replace(R.id.container, chatsFragment).commit();
                    break;
                case R.id.btnPost:
                    bottomNav.setSelectedItemId(R.id.btnPost);
                    PostsFragment postsFragment = new PostsFragment();
                    android.support.v4.app.FragmentManager manager2 = getSupportFragmentManager();
                    manager2.beginTransaction().replace(R.id.container, postsFragment).commit();
                    break;
                case R.id.btnFavourites:
                    bottomNav.setSelectedItemId(R.id.btnFavourites);
                    FavouritesFragment favouritesFragment = new FavouritesFragment();
                    android.support.v4.app.FragmentManager manager3 = getSupportFragmentManager();
                    manager3.beginTransaction().replace(R.id.container, favouritesFragment).commit();
                    break;
                case R.id.btnProfile:
                    bottomNav.setSelectedItemId(R.id.btnProfile);
                    ProfileFragment profileFragment = new ProfileFragment();
                    android.support.v4.app.FragmentManager manager4 = getSupportFragmentManager();
                    manager4.beginTransaction().replace(R.id.container, profileFragment).commit();
                    break;
            }
            return false;
        }
    });

}
}

这是 layout_welcome 文件

<android.support.design.widget.CoordinatorLayout

xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.matt.mustjob.Home.Welcome">

<android.support.v4.view.ViewPager
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginBottom="50dp"/>

<com.ittianyu.bottomnavigationviewex.BottomNavigationViewEx
    android:id="@+id/nav_bottom"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom"
    android:background="#431C60"
    app:menu="@menu/menu"
    app:itemIconTint="#fff"
    app:itemTextColor="#FFF"/>

</android.support.design.widget.CoordinatorLayout>

您需要更改的一些内容:

1) 不要将 ViewPager 用作 Fragment 容器,有一种方法可以将 FragmentsViewPager 一起使用并在 Adapter。 Google 搜索“viewpager with fragments example in android”以了解如何使用它。如果您不需要 ViewPager 功能,您可以使用 FrameLayout 作为容器。

2) 您不需要将 Context 保存在 Activity 中,您可以随时使用 getApplicationContext()getBaseContext() 或简单地 this (或 YourActivity.this 取决于范围)

3) 无需每次都调用getSupportFragmentManager();。您可以调用它一次并将引用分配给 Activity:

中的成员
private FragmentManager manager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    manager = getSupportFragmentManager()
}

// Somewhere else:
manager.beginTransaction()...

4) 在处理 onNavigationItemSelected 事件后,您需要 return true;,因此不要在每次选择后调用 break;,而是这样做:

...
case R.id.btnHome:
  bottomNav.setSelectedItemId(R.id.btnHome);
  HomeFragment homeFragment = new HomeFragment();
  android.support.v4.app.FragmentManager manager = getSupportFragmentManager();
  manager.beginTransaction().replace(R.id.container, homeFragment).commit();
  return true; // This thing here
...

除了@Hed Shafran 的回答,试试这个:

检查你的 logcat。当应用程序崩溃时,某些设备可能不会显示 ANR 对话框。 一次又一次地启动欢迎 Activity 案例可能只是因为应用程序已停止工作,因为出现错误。