Работаем над фрагментом Backbutton android
Я работаю над блоком навигации и фрагментами, и в настоящее время у меня возникла проблема с изображением. Рассмотрим (Пончик) класс HomeFragment. Чего я хотел бы достичь, так это
когда пользователь перемещается по Фрагменту A(Пончик) -> Фрагмент B(Эклер), затем снова перемещается -> Фрагмент H(kitkat), а затем перемещается -> Фрагмент I(Lollipop)
и пользователь работает над этим. Если пользователь нажимает кнопку, он может работать на основе иерархии, как
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 или любого другого класса фрагмента, он переходит к другому классу фрагмента внутри, а затем нажимает кнопку, после чего он непосредственно переходит к фрагменту A. Итак, здесь мне нужно использовать иерархию обратных стеков и, наконец, к фрагменту класса и завершает приложение, пожалуйста, смотрите код ниже.
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;
}
}
Так вот
Мне нужно (добиться) использовать кнопку для правильной работы, как Galaxy2Fragment -> GalaxyFragment -> HomeFragment class.
Может ли кто-нибудь дать мне предложения, как работать с этими фрагментами Backbutton в таких случаях. Предложения приветствуются. Благодарю.
4 ответа
Самый простой способ заменить эту строку
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, если вы делаете это.
Вы устанавливаете addtobackstack в ноль. Вместо этого вы должны написать TAG имя заменяющего фрагмента.
фрагмент Manager.beginTransaction().replace(R.id.main_fragment_container, фрагмент).addToBackStack(null).commit();
вместо
fragmentManager.beginTransaction().replace(R.id.main_fragment_container, fragment).addToBackStack("**TAG name of an replacing fragment**").commit();
Случай 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);
}
}
вызовите этот метод перед открытием фрагментов, кроме 1-го фрагмента
Случай 2: Предполагается - FragmentC -> FragmentB -> FragmentA.
Для этого все, что вам нужно сделать, это использовать fragmentTransaction.addToBackstack(fragment.toString);
перед совершением.. а затем переопределите onBackPress в своей деятельности:
@Override
public void onBackPressed() {
if (getSupportFragmentManager().getBackStackEntryCount() > 1) {
mFragmentManager.popBackStackImmediate();
}
}
Удостоверьтесь, что вы не вызываете вышеупомянутый метод, упомянутый для "Case1" прежде, чем передать эти 3 фрагмента
Попробуйте что-то вроде этого...
if (!<titleTextView here>.getText().toString().equalsIgnoreCase("<Title of the First Fragment>")) {
<Open fragment 1>
<set the title>
} else {
finish();
}
}