【问题标题】:How to set a fragment as default fragment for BottomNavigation?如何将片段设置为底部导航的默认片段?
【发布时间】:2020-04-13 08:45:34
【问题描述】:

我的 MainActivity.java 中有一个底部导航,其中包含 3 个片段。 我想将我的片段之一设置为默认在应用程序启动时自动打开。 我怎样才能做到这一点? 这是我的主要 Activity.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;
}
}

我该怎么办?

【问题讨论】:

标签: java android android-fragments


【解决方案1】:

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

注意setSelectedItemId() 会触发你的OnNavigationItemSelectedListener,所以你应该把这个代码放在你调用setOnNavigationItemSelectedListener() 之后。

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

【讨论】:

  • 它可以工作,但是当默认情况下设置第一个片段时,我的选项卡有问题现在,如果我再次单击同一个选项卡视图,那么我的顶部选项卡视图可见性消失了为什么还有其他数据我正在使用底部导航视图使用 tabviewpager
【解决方案2】:

如果你在一行中使用导航:

mobile_navigation.xml

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

【讨论】:

    【解决方案3】:

    试试这个:在你的容器活动的 onCreate() 中,放

    // Default Fragment
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.frameContainer, new HomeFragment())
                .commit();
    

    【讨论】:

      【解决方案4】:

      BottomNavigationView 库中,没有要呈现的默认片段的定义,它可以让您完全控制通过编程设置哪个片段可见,正如 Ben 指出的那样。

      我不久前已经实现了这个,我相信你正面临着后压问题,你可能想回到“默认”片段。在我的例子中,我实现了一个interface,它被称为活动的onBackPressed,一旦用户按下晒太阳,只需调用以下方法将“默认片段”设置为选中

      bottomNavigationView.setSelectedItem(R.id.myDefaultTabID);
      

      【讨论】:

        【解决方案5】:

        试试这个:

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

        并在setOnNavigationItemSelectedListener 之后调用setDefaultFragment()

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-08
          • 1970-01-01
          相关资源
          最近更新 更多