在BottomNavigationView中启动片段

我正在使用一个带有底部导航视图的简单应用程序。 我有3个文本片段,我想在Botton导航中选择一个项目时开始他们,但我不知道在MainActivity.java中要写什么; 所有片段都有.xml布局和.java。 我搜索了一些代码,我写了它们,我搜索video,但我没有成功。

我正在学习Fragments和UI Dynamic,所以我在Android Studio中使用Bottom Navigation Activity创建了一个新项目。 所以,在我的activity_main中,我在底层导航中有3个itens,在Bottom Navigation上面有一个framelayout,占用了所有父级。 这个想法是:当我在底部导航中选择一个项目时,它将在framelayout中显示另一个布局。 所以我在布局文件夹中创建了3个xml布局(也使用了java类),在framelayout中创建了一个片段。 现在,当我选择一个项目时,我正试图在我的framelayout(有一个片段)中显示这些布局。 但我不知道该怎么做。

主要活动`

private TextView mTextMessage; private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener = new BottomNavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { Fragment selectedFragment = null; switch (item.getItemId()) { case R.id.navigation_home: selectedFragment = HomeFragment.newInstance(); break; case R.id.navigation_dashboard: selectedFragment = DashboardFragment.newInstance(); break; case R.id.navigation_notifications: selectedFragment = NotificationsFragment.newInstance(); break; } FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.replace(R.id.content, selectedFragment); transaction.commit(); return true; } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation); navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.replace(R.id.content, HomeFragment.newInstance()); transaction.commit(); } 

activity_main xml

     

导航xml

    

Fragment.java示例

 public class HomeFragment extends Fragment { public static HomeFragment newInstance() { HomeFragment fragment = new HomeFragment(); return fragment; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.navigation_home, container, false); return inflater.inflate(R.layout.navigation_home, container, false); } 

首先,在您的activity_main.xml中,我们不需要3个不同的片段,因为我们可以替换或仅在1个FrameLayout中添加任何选定的片段。 其次,当用户从Bottom NavigationView中选择任何一个时,只需获取相关Fragment类的实例,并将其替换为您的activity_main的FrameLayout。

 Fragment selectedFragment = null; switch (item.getItemId()) { case R.id.navigation_home: selectedFragment = FunFragment.newInstance(); break; 

获取所选片段的实例后,将其替换为activity_main的FrameLayout,以便在屏幕上显示。

 FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.replace(R.id.content, selectedFragment); transaction.commit(); 

编辑标签 步骤1.您的activity_main.xml应如下所示

      

第2步。您的fragment_home.xml布局应该是这样的

      

为您的三个不同选项制作3种不同的片段布局

第3步。您的MainActivity.java类将是这样的

 private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener = new BottomNavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(MenuItem item) { Fragment selectedFragment = null; switch (item.getItemId()) { case R.id.navigation_home: selectedFragment = FunFragment.newInstance(); break; case R.id.navigation_dashboard: selectedFragment = TheoryFragment.newInstance(); break; case R.id.navigation_notifications: selectedFragment = AndroidFragment.newInstance(); break; } FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.replace(R.id.content, selectedFragment); transaction.commit(); return true; } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.replace(R.id.content, FunFragment.newInstance()); transaction.commit(); } 

在创建时,在启动应用程序之后用要显示的片段替换,导航监听器将处理您将选择的选项

第4步。您将拥有3个不同的Fragment类,看起来像这样

 public class TheoryFragment extends Fragment { public static TheoryFragment newInstance() { TheoryFragment fragment = new TheoryFragment(); return fragment; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_theory, container, false); unbinder = ButterKnife.bind(this, rootView); return rootView; } } 

希望它能帮助你,让我知道是否有任何问题。

获取HomeFragment,DashboardFragment和NotificationFragment等三个片段以及这三个片段的三个布局。

HomeFragment

 public class HomeFragment extends Fragment { public HomeFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_home, container, false); } } 

fragment_home.xml

    

** DashboardFragment **

 public class DashboardFragment extends Fragment { public DashboardFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_dashboard, container, false); } } 

fragment_dashboard.xml

    

** NotificationFragment **

 public class NotificationFragment extends Fragment { public NotificationFragment () { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_notification, container, false); } } 

fragment_notification.xml

    

这是你的活动。

 public boolean onNavigationItemSelected(@NonNull MenuItem item) { int id = item.getItemId(); switch (id){ case R.id.Fragment_one: fragment = new HomeFragment(); break; case R.id.Fragment_two: fragment = new DashboardFragment(); break; case R.id.Fragment_three: fragment = new NotificationFragment(); break; } final FragmentTransaction transaction = fragmentManager.beginTransaction(); transaction.replace(R.id.main_container, fragment).commit(); return true; } }); 

我想补充一点,如果你想使用你的BottomNavigationView.OnNavigationItemSelectedListener()来选择你的开始片段,你可以使用setSelectedItemId()例如:

将’ R.id.navigation_home ‘替换为您自己的起始片段。

 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation); navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener); navigation.setSelectedItemId(R.id.navigation_home); } 

单独创造这种方法

 protected boolean openFragment(Fragment fragment){ getSupportFragmentManager() .beginTransaction() .replace(R.id.content, fragment) .commit(); return true; } 

在交换机中编辑

 public boolean onNavigationItemSelected(@NonNull MenuItem item) { switch (item.getItemId()) { case R.id.navigation_home: return openFragment(OneFragment.newInstance("","")); case R.id.navigation_beehive: return openFragment(twoFragment.newInstance("","")); case R.id.navigation_notifications: return openFragment(otherFragment.newInstance("","")); } return false; } 

并且为了最终确定你可以用片段初始化

  protected void onCreate(Bundle savedInstanceState) { .... openFragment(OneFragment.newInstance("","")); }