[英]How to change fragments using Android navigation drawer
I know these types of question have already been here but still I have not found my answer for this question:我知道这些类型的问题已经出现了,但我仍然没有找到这个问题的答案:
Here's what I have:这是我所拥有的:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mNavigationDrawerFragment = (NavigationDrawerFragment)
getFragmentManager().findFragmentById(R.id.navigation_drawer);
mTitle = getTitle();
// Set up the drawer.
mNavigationDrawerFragment.setUp(
R.id.navigation_drawer,
(DrawerLayout) findViewById(R.id.drawer_layout));
}
@Override
public void onNavigationDrawerItemSelected(int position) {
// update the main content by replacing fragments
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.container, PlaceholderFragment.newInstance(position + 1))
.commit();
}
public void onSectionAttached(int number) {
switch (number) {
case 1:
break;
case 2:
break;
case 3:
break;
}
}
And some more here:还有一些在这里:
public static PlaceholderFragment newInstance(int sectionNumber) {
PlaceholderFragment fragment = new PlaceholderFragment();
Bundle args = new Bundle();
args.putInt(ARG_SECTION_NUMBER, sectionNumber);
fragment.setArguments(args);
return fragment;
}
public PlaceholderFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
return rootView;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
((MainActivity) activity).onSectionAttached(
getArguments().getInt(ARG_SECTION_NUMBER));
}
}
I want to display another fragment using the button in navigation drawer.我想使用导航抽屉中的按钮显示另一个片段。 I want to use this code so please do not send me any guides or tutorials making their own drawers..
我想使用此代码,所以请不要向我发送任何制作自己抽屉的指南或教程..
The question is, what do I put in case 1:
case 2:
and case 3:
in case I want to open another fragment?问题是,如果我想打开另一个片段,我在
case 1:
case 2:
和case 3:
中放什么? Thanks.谢谢。
One more question:还有一个问题:
How do I add more fragments and transactions?如何添加更多片段和交易? This doesn't work-
这不起作用-
Fragment fragment = new MyFragment1(); Fragment frag = new MyFragment2(); FragmentManager fragmentManager = getFragmentManager(); switch(position) { case 0: fragment = new MyFragment1(); break; case 1: frag = new MyFragment2(); break; } fragmentManager.beginTransaction() .replace(R.id.container, fragment).commit();
You should just put a switch statement into the onNavigationDrawerItemSelected
method.您应该只将 switch 语句放入
onNavigationDrawerItemSelected
方法中。
Something like this should work:这样的事情应该工作:
public void onNavigationDrawerItemSelected(int position) {
// update the main content by replacing fragments
Fragment fragment;
FragmentManager fragmentManager = getFragmentManager(); // For AppCompat use getSupportFragmentManager
switch(position) {
default:
case 0:
fragment = new MyFragment1();
break;
case 1:
fragment = new MyFragment2();
break;
}
fragmentManager.beginTransaction()
.replace(R.id.container, fragment)
.commit();
}
This is just done quickly but I think it should work这只是很快完成,但我认为它应该起作用
I solved this problem over inflater
:我通过
inflater
解决了这个问题:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView;
switch(getArguments().getInt(ARG_SECTION_NUMBER)) {
case 1:
rootView = inflater.inflate(R.layout.fragment_obj_detail, container, false);
break;
case 2:
rootView = inflater.inflate(R.layout.fragment_obj_list, container, false);
break;
case 3:
rootView = inflater.inflate(R.layout.fragment_obj_list, container, false);
break;
case 4:
rootView = inflater.inflate(R.layout.fragment_about, container, false);
break;
default:
rootView = inflater.inflate(R.layout.fragment_obj_list, container, false);
}
return rootView;
}
You need to create a switch
block inside the onNavigationDrawerItemSelected(
) and use the code that's already there for every case
but with corresponding Fragment
instead of PlaceholderFragment
.您需要在
onNavigationDrawerItemSelected(
) 中创建一个switch
块,并使用针对每种case
已经存在的代码,但使用相应的Fragment
而不是PlaceholderFragment
。 Now it contains a generic piece of code for adding a PlaceholderFragment
to the layout, reuse it for your purposes.现在它包含了一段用于向布局添加
PlaceholderFragment
的通用代码,可将其重用于您的目的。
The response of DenisGl, is the right way !!! DenisGl 的回应,是正确的方法!!! Using the class member, created by default, you can switch between the various components of the Navigation Drawer !!
使用默认创建的类成员,您可以在导航抽屉的各个组件之间切换!! You have to use the method onCreateView, which are within the class member PlaceholderFragment.
您必须使用 onCreateView 方法,该方法位于类成员 PlaceholderFragment 中。 This class will be automatically invoked in the method onNavigationDrawerItemSelected
该类将在方法 onNavigationDrawerItemSelected 中自动调用
Here is the code example: / This method can be left as it is!下面是代码示例: /这个方法可以保持原样! It automatically invoke the class PlaceholderFragment!
它会自动调用类 PlaceholderFragment! /
/
@Override
public void onNavigationDrawerItemSelected(int position) {
// update the main content by replacing fragments
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.container, PlaceholderFragment.newInstance(position + 1))
.commit();
}
This method instead, where you enter the Switch Case :而是使用此方法,您可以在其中输入Switch Case :
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = null;
rootView = inflater.inflate(R.layout.fragment_home, container, false);
switch(getArguments().getInt(ARG_SECTION_NUMBER)) {
case 1:
rootView = inflater.inflate(R.layout.fragment_home, container, false);
break;
case 2:
//rootView = inflater.inflate(R.layout.fragment_obj_list, container, false);
break;
case 3:
//rootView = inflater.inflate(R.layout.fragment_obj_list, container, false);
break;
case 4:
rootView = inflater.inflate(R.layout.fragment_info, container, false);
break;
}
return rootView;
}
Obviously, you have to call the layout for each fragment that interests us!显然,您必须为我们感兴趣的每个片段调用布局!
This works 100%, Test to verify!这 100% 有效,测试验证!
It does work in Eclipse IDE它在 Eclipse IDE 中工作
switch(getArguments().getInt(ARG_SECTION_NUMBER)) {
case 1:
rootView = inflater.inflate(R.layout.fragment_home, container, false);
break;
case 2:
//rootView = inflater.inflate(R.layout.fragment_obj_list, container, false);
break;
case 3:
//rootView = inflater.inflate(R.layout.fragment_obj_list, container, false);
break;
case 4:
rootView = inflater.inflate(R.layout.fragment_info, container, false);
break;
}
in function在功能上
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = null;
rootView = inflater.inflate(R.layout.fragment_home, container, false);
return rootView;
}
In function:在功能上:
Bundle bundle = new Bundle();
bundle.putInt("id", 10);//sending data to the second fragment
NavHostFragment.findNavController(HomeFragment.this)//your fragment
.navigate(R.id.action_nav_home_to_products_related_for_home_category,bundle);
In mobile_navigation.xml:在 mobile_navigation.xml 中:
<fragment
android:id="@+id/nav_home"
android:name="com.example.myapplication.ui.home.HomeFragment"
android:label="@string/menu_home"
tools:layout="@layout/fragment_home" >
<action
android:id="@+id/action_nav_home_to_products_related_for_home_category"
app:destination="@id/products_related_for_home_category"
app:enterAnim="@anim/nav_default_enter_anim"
app:exitAnim="@anim/nav_default_exit_anim"
app:popEnterAnim="@anim/nav_default_pop_enter_anim"
app:popExitAnim="@anim/nav_default_pop_exit_anim"
>
<argument
android:name="myArg"
app:argType="integer"
android:defaultValue="1" />
</action>
</fragment>
In second fragment:在第二个片段中:
int id=getArguments().getInt("id");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.