我正在处理导航抽屉和片段,目前我正面临着来自图像的问题考虑(Donut)是HomeFragment类。 我想要实现的是
当用户导航片段A(甜甜圈) - >片段B(Eclair)然后再次 导航 - >片段H(kitkat)然后导航 - >分段 I(棒棒糖)
和用户正在处理它。如果用户按下后退按钮它可能 基于层次结构工作
super.onBackPressed();
结果按下结果为片段I - >片段H - > 片段B - >最后片段A。
现在我需要将用户直接导航到片段A,而不需要去其他片段类。
我已经使用
实现了这一目标public class MainActivity extends AppCompatActivity {
//initializing
int check = 0; in MainActivity
....................
...................
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_drawer);
.................
................
drawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
TextView tv = (TextView) view.findViewById(R.id.textView1);
String aa = tv.getText().toString();
selectItemFragment(position, aa);
}
});
...................
...................
private void selectItemFragment(int position, String aa) {
Fragment fragment2;
FragmentManager fragmentManager = getSupportFragmentManager();
switch (position) {
case 0:
fragment2 = new HomeFragment();
break;
case 1:
fragment2 = new GalaxyFragment();
break;
case 2:
fragment2 = new ShareFragment();
break;
default:
fragment2 = new HomeFragment();
break;
}
check = position;
ffragm = fragment2;
fragmentManager.beginTransaction().replace(R.id.main_fragment_container, fragment2).addToBackStack(null).commit();
drawerList.setItemChecked(position, true);
setTitle(aa);
mDrawerLayout.closeDrawer(drawerList);
}
..........................
............................
@Override
public void onBackPressed() {
if (check == 0) {
finish();
} else {
check = 0;
Fragment fragment2;
FragmentManager fragmentManager = getSupportFragmentManager();
fragment2 = new HomeFragment();
fragmentManager.beginTransaction().replace(R.id.main_fragment_container, fragment2).addToBackStack(null).commit();
}
}
我在这里遇到问题, 考虑当用户在Galaxyfragment类或任何其他片段类中工作时,他导航到另一个片段类里面,然后按回按钮直接导航到Fragment A.So,这里我需要使用后面的堆栈层次结构,最后到Fragment分类并完成申请,请参阅以下代码。
public class GalaxyFragment extends Fragment {
Context cc;
Button Addbutton;
public GalaxyFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout for this fragment
View v = inflater.inflate(R.layout.home_fragment, container, false);
ll1design = (LinearLayout) v.findViewById(R.id.llone);
Create_list = (Button) v.findViewById(R.id.submit);
Addbutton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
display_button.setVisibility(View.VISIBLE);
ll1design.setVisibility(View.GONE);
String value = "";
Bundle bundle = new Bundle();
bundle.putString("message", "" + value);
FragmentManager fragmentManager = getFragmentManager();
Fragment fragment = new ShareFragment();
fragment.setArguments(bundle);
fragmentManager.beginTransaction().replace(R.id.main_fragment_container, fragment).addToBackStack(null).commit();
}
});
return v;
}
}
所以这里
我需要(实现)使用backbutton正常工作,如Galaxy2Fragment - &gt; GalaxyFragment - &gt; HomeFragment类。
任何人都可以给我建议如何在这些类型的案例上处理这些Backbutton片段。欢迎提出建议。感谢。
答案 0 :(得分:1)
您正在将addtobackstack设置为null。相反,您应该编写替换片段的TAG名称。
fragmentManager.beginTransaction()。replace(R.id.main_fragment_container,fragment).addToBackStack(null).commit();
而不是
fragmentManager.beginTransaction().replace(R.id.main_fragment_container, fragment).addToBackStack("**TAG name of an replacing fragment**").commit();
答案 1 :(得分:1)
案例1: 直接导航到稍后打开的任何其他片段中的第一个片段
private void popByFragment() {
//keeping only the root fragment in the stack
int backStackCount = mFragmentManager.getBackStackEntryCount();
for (int i = 1; i < backStackCount; i++) {
// we start from "i=1" since we dont wish to pop the 1st fragment added to stack
//Get backstack fragment id
//Log.e("backstack count", "count-->" + backStackCount);
int backStackId = mFragmentManager.getBackStackEntryAt(i).getId();
mFragmentManager.popBackStack(backStackId, FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
}
在打开第一个片段
以外的片段之前调用此方法案例2:假设 - FragmentC - &gt; FragmentB - &gt; FragmentA。
为此,您只需使用fragmentTransaction.addToBackstack(fragment.toString);
在提交之前...然后在你的活动中覆盖onBackPress:
@Override
public void onBackPressed() {
if (getSupportFragmentManager().getBackStackEntryCount() > 1) {
mFragmentManager.popBackStackImmediate();
}
}
请确保您没有为&#34; Case1&#34;提及上述方法。在提交这3个片段之前
答案 2 :(得分:1)
最简单的方法是替换此行
fragmentManager.beginTransaction().replace(R.id.main_fragment_container, fragment2).addToBackStack(null).commit();
到
FragmentTransaction ft =fragmentManager.beginTransaction()
ft.replace(R.id.main_fragment_container, fragment2)
if(fragmentManger.findFragmentById(R.id.main_fragment_container) instanceof HomeFragment)
ft.addToBackStack(null))
ft.commit();
如果你这样做,你不需要覆盖onBackPressed。
答案 3 :(得分:0)
尝试这样的事情......
if (!<titleTextView here>.getText().toString().equalsIgnoreCase("<Title of the First Fragment>")) {
<Open fragment 1>
<set the title>
} else {
finish();
}
}