处理片段后退按钮 android
Working on Fragment Backbutton android
我正在处理导航抽屉和片段,目前我面临图像 Consider (Donut) is HomeFragment class 的问题。
我想要实现的是
when user navigate Fragment A(Donut) -> Fragment B(Eclair) then again
navigates -> Fragment H(kitkat) and then navigates -> Fragment
I(Lollipop)
和正在处理它的用户。如果用户按下后退按钮,它可能
基于层次结构工作
super.onBackPressed();
As result pressing back results as Fragment I -> Fragment H ->
Fragment B -> finally Fragment A.
现在我需要将用户直接导航到片段 A,而无需转到其他片段 classes。
我使用
实现了这个
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 class 或任何其他片段 class 中工作时,他导航到另一个片段 class 里面,然后他按下后退按钮它直接导航到片段 A.So,这里我需要使用返回堆栈层次结构,最后到 Fragment Class 并完成应用程序,请参见下面的代码。
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;
}
}
所以这里
i need to(Achieve) use backbutton to working correctly as Galaxy2Fragment ->
GalaxyFragment -> HomeFragment class.
任何人都可以给我建议如何在这些类型的情况下处理这些后退按钮片段。欢迎提出建议。谢谢。
尝试这样的事情...
if (!<titleTextView here>.getText().toString().equalsIgnoreCase("<Title of the First Fragment>")) {
<Open fragment 1>
<set the title>
} else {
finish();
}
}
您正在将 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();
案例一:
从以后打开的任何其他片段直接导航到第一个片段
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 -> FragmentB -> FragmentA。
为此,您所要做的就是使用 fragmentTransaction.addToBackstack(fragment.toString);
在提交之前.. 然后在 activity:
中覆盖 onBackPress
@Override
public void onBackPressed() {
if (getSupportFragmentManager().getBackStackEntryCount() > 1) {
mFragmentManager.popBackStackImmediate();
}
}
确保在提交这 3 个片段之前没有调用上述 "Case1" 的方法
最简单的方法是替换此行
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。
我正在处理导航抽屉和片段,目前我面临图像 Consider (Donut) is HomeFragment class 的问题。 我想要实现的是
when user navigate Fragment A(Donut) -> Fragment B(Eclair) then again navigates -> Fragment H(kitkat) and then navigates -> Fragment I(Lollipop)
和正在处理它的用户。如果用户按下后退按钮,它可能 基于层次结构工作
super.onBackPressed();
As result pressing back results as Fragment I -> Fragment H -> Fragment B -> finally Fragment A.
现在我需要将用户直接导航到片段 A,而无需转到其他片段 classes。
我使用
实现了这个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 class 或任何其他片段 class 中工作时,他导航到另一个片段 class 里面,然后他按下后退按钮它直接导航到片段 A.So,这里我需要使用返回堆栈层次结构,最后到 Fragment Class 并完成应用程序,请参见下面的代码。
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;
}
}
所以这里
i need to(Achieve) use backbutton to working correctly as Galaxy2Fragment -> GalaxyFragment -> HomeFragment class.
任何人都可以给我建议如何在这些类型的情况下处理这些后退按钮片段。欢迎提出建议。谢谢。
尝试这样的事情...
if (!<titleTextView here>.getText().toString().equalsIgnoreCase("<Title of the First Fragment>")) {
<Open fragment 1>
<set the title>
} else {
finish();
}
}
您正在将 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();
案例一: 从以后打开的任何其他片段直接导航到第一个片段
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 -> FragmentB -> FragmentA。
为此,您所要做的就是使用 fragmentTransaction.addToBackstack(fragment.toString);
在提交之前.. 然后在 activity:
@Override
public void onBackPressed() {
if (getSupportFragmentManager().getBackStackEntryCount() > 1) {
mFragmentManager.popBackStackImmediate();
}
}
确保在提交这 3 个片段之前没有调用上述 "Case1" 的方法
最简单的方法是替换此行
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。