如何将一个Fragment设置为BottomNavigation的默认Fragment?

5

我在MainActivity.java中有一个底部导航栏,其中包含3个片段。我想将其中一个片段设置为默认打开应用程序启动时自动打开的页面。我该怎么做?这是我的MainActivity.java代码:

public class MainActivity extends AppCompatActivity {
private static final String TAG = MainActivity.class.getSimpleName();
private BottomNavigationView bottomNavigation;
private Fragment fragment;
private android.support.v4.app.FragmentManager fragmentManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    bottomNavigation = (BottomNavigationView)findViewById(R.id.bottom_navigation);
    bottomNavigation.inflateMenu(R.menu.bottom_menu);
    fragmentManager = getSupportFragmentManager();



    bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            Fragment selectedFragment = null;
            int id = item.getItemId();
            switch (id){
                case R.id.intros:
                    fragment = new IntrosFragment();
                    break;
                case R.id.menus:
                    fragment = new MenusFragment();
                    break;
                case R.id.infos:
                    fragment = new InfosFragment();
                    break;
            }
            FragmentTransaction transaction = fragmentManager.beginTransaction();
            transaction.replace(R.id.main_container, fragment).commit();
            return true;
        }
    });


}
}

这是一个例子中的片段(它们都是相同的):

public class IntrosFragment extends Fragment {


public IntrosFragment() {

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_intro, container, false);
    // Inflate the layout for this fragment
    TextView txt = (TextView) rootView.findViewById(R.id.introtv);
    Typeface font = Typeface.createFromAsset(getActivity().getAssets(), "fonts/naskh.ttf");
    txt.setTypeface(font);

    return rootView;
}
}

我该怎么办?


可能是导航抽屉默认片段的重复问题。 - Ivan Pronin
5个回答

10

您可以利用savedInstanceState在活动第一次创建时为null的事实,仅在首次启动时执行代码。并且您可以使用setSelectedItemId()设置任何选定的导航项。

请注意,setSelectedItemId()会触发您的OnNavigationItemSelectedListener,因此您应该将此代码放在调用setOnNavigationItemSelectedListener()之后。

    if (savedInstanceState == null) {
        bottomNavigation.setSelectedItemId(R.id.infos); // change to whichever id should be default
    }

它可以工作,但是当默认设置第一个片段时,我有一个选项卡问题。现在,如果我再次点击同一选项卡视图,则我的顶部选项卡视图可见性消失了,为什么?其他数据还在,我正在使用带有TabViewPager的BottomNavigationView。 - Sunil Chaudhary

4
如果您在一行中使用导航菜单:

mobile_navigation.xml

<navigation
...
    app:startDestination="@+id/navigation_home"
...
/>

2
尝试这样做:在您的容器活动的onCreate()中,放置以下代码:
// Default Fragment
    getSupportFragmentManager().beginTransaction()
            .replace(R.id.frameContainer, new HomeFragment())
            .commit();

1
BottomNavigationView库中没有默认片段的定义,通过编程设置可见的片段可以完全控制。我最近实现了这个功能,我认为您可能会遇到返回问题,您可能想返回到“默认”片段。在我的情况下,我实现了一个名为onBackPressedinterface,一旦用户按下后退键,只需调用以下方法将“默认片段”设置为选定项即可。
bottomNavigationView.setSelectedItem(R.id.myDefaultTabID);

1

试试这个:

private void setDefaultFragment() {
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.replace(R.id.frame_layout, YOURFRAGMENT.newInstance());
        transaction.commit();

    }

在调用 setOnNavigationItemSelectedListener 后调用 setDefaultFragment()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接