如何将片段设置为BottomNavigation的默认片段?

时间:2017-08-15 19:38:46

标签: java android android-fragments

我的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;
}
}

我该怎么办?

5 个答案:

答案 0 :(得分:3)

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

请注意,setSelectedItemId()会触发您的OnNavigationItemSelectedListener,因此您应在致电setOnNavigationItemSelectedListener()后填写此代码。

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

答案 1 :(得分:2)

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

mobile_navigation.xml

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

答案 2 :(得分:1)

尝试一下:在容器活动的onCreate()中,放入

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

答案 3 :(得分:0)

BottomNavigationView库中没有要呈现的默认片段的定义,通过以Ben指出的方式设置它,可以完全控制哪个片段可见。

我在不久前实现了这一点,我相信你正面临着背压问题,你可能想回到&#34;默认&#34;分段。在我的情况下,我实现了一个interface,它被称为活动的onBackPressed,一旦用户点击bask按下,只需调用以下方法来设置&#34;默认片段&#34;如选中

bottomNavigationView.setSelectedItem(R.id.myDefaultTabID);

答案 4 :(得分:0)

尝试一下:

FetchMode.SELECT

然后在private void setDefaultFragment() { FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.replace(R.id.frame_layout, YOURFRAGMENT.newInstance()); transaction.commit(); } 之后致电setDefaultFragment()