在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("","")); }