如何调用 popbackstack 而不是删除 backstack 上的先前条目以便我可以再次使用它?
How to call popbackstack and not delete the previous entries on backstack so i could use it again?
我有一个自定义日历,它在 activity 的顶部显示一周中的 7 天。我希望当用户在一天按下时添加一个带有唯一标签的新片段,这样我就可以将其回调并再次显示用户在已经按下并放置数据的同一日期按下时输入的数据。这是我的应用程序的外观 -> http://prntscr.com/o276v6
我尝试使用 addtoBackStack(tag) 并调用 popbackstack。
public class CalendarView extends LinearLayout{
...
private FragmentManager manager;
private FragmentTransaction transaction;
private CalendarAdapter mAdapter; //CalendarAdapter is a class that i make to fill the gridview with dates
...
private void setGridCellClickEvents(){ //when a date pressed
calendarGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
manager=((Activity)context).getFragmentManager(); //FragmentManager
HomeFragment selected=new HomeFragment();
int position1=position; //position in gridview 1-7
Object current_date= mAdapter.getItem(position); //getting the selected date from the adapter as object
String tag =formater1.format(current_date); //format the date from the object
boolean backstack_exist =manager.popBackStackImmediate(tag,0);
if (!backstack_exist && manager.findFragmentByTag(tag) == null){
transaction= manager.beginTransaction(); //FragmentTransaction
transaction.replace(R.id.user_frame,selected,"position"+position)
.addToBackStack(tag) // addtobackstack with unique tag e.g 15 06 19
.commit();
}else {
manager.popBackStack(tag,0); //popbackstack that unique tag
}
Log.d(TAG,"Changed");
}
});
但是使用 popbackstack 删除了 backstack 中以前的条目,所以我使用 data.So 丢失了片段我想使用 popbackstack 是错误的方式,或者我可以覆盖一些方法,比如 onDestroy 以在我调用 popbackstack 方法时不删除片段.还是我必须在 onSaveInstanceState 中做一些事情来保存我的片段和数据?
我是 android 的新手,使用一些代码并参考了 link,所以我理解你的代码并学到一些东西会很感激。
这个方法可以帮助你在做的时候保留Fragment。
public static void SetFragment(Fragment mFragment, Context mcontext,String title)
{
String backStateName = mFragment.getClass().getName();
FragmentTransaction ft = masterFragmentManager.beginTransaction();
ft.replace(R.id.content_frame, mFragment,backStateName);
ft.addToBackStack(null);
ft.commit();
if (((AppCompatActivity)mcontext).getSupportActionBar() != null) {
((AppCompatActivity)mcontext). getSupportActionBar().setTitle(title);
}
}
这里允许查看Fragment popbackstack
ft.addToBackStack(null);
我想回答我的问题,所以如果有人来这里我会帮助他们。
我用添加、显示和隐藏解决了我的问题,所以片段保持活动状态而不是重新创建。(我不知道这是否是一个很好的性能解决方案)
manager=getFragmentManager(); //FragmentManager
HomeFragment selected=new HomeFragment();
int position1=position; //position in gridview 1-7
Object current_date= parent.getAdapter().getItem(position); //getting the selected date from the adapter as object
tag = formater1.format(current_date); //format the date
Fragment previous_fragment = manager.findFragmentByTag(previous);
if (previous_fragment!=null){
transaction= manager.beginTransaction();
transaction.hide(previous_fragment)
.commit();
}
if ( manager.findFragmentByTag(tag) == null){
transaction= manager.beginTransaction(); //FragmentTransaction
transaction.add(R.id.user_frame,selected,tag)
.commit();
}else {
Fragment my_fragment = manager.findFragmentByTag(tag);
transaction=manager.beginTransaction();
transaction.show(my_fragment)
.commit();
}
previous=tag;
previous_view=view;
previous_position=position;
我有一个自定义日历,它在 activity 的顶部显示一周中的 7 天。我希望当用户在一天按下时添加一个带有唯一标签的新片段,这样我就可以将其回调并再次显示用户在已经按下并放置数据的同一日期按下时输入的数据。这是我的应用程序的外观 -> http://prntscr.com/o276v6
我尝试使用 addtoBackStack(tag) 并调用 popbackstack。
public class CalendarView extends LinearLayout{
...
private FragmentManager manager;
private FragmentTransaction transaction;
private CalendarAdapter mAdapter; //CalendarAdapter is a class that i make to fill the gridview with dates
...
private void setGridCellClickEvents(){ //when a date pressed
calendarGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
manager=((Activity)context).getFragmentManager(); //FragmentManager
HomeFragment selected=new HomeFragment();
int position1=position; //position in gridview 1-7
Object current_date= mAdapter.getItem(position); //getting the selected date from the adapter as object
String tag =formater1.format(current_date); //format the date from the object
boolean backstack_exist =manager.popBackStackImmediate(tag,0);
if (!backstack_exist && manager.findFragmentByTag(tag) == null){
transaction= manager.beginTransaction(); //FragmentTransaction
transaction.replace(R.id.user_frame,selected,"position"+position)
.addToBackStack(tag) // addtobackstack with unique tag e.g 15 06 19
.commit();
}else {
manager.popBackStack(tag,0); //popbackstack that unique tag
}
Log.d(TAG,"Changed");
}
});
但是使用 popbackstack 删除了 backstack 中以前的条目,所以我使用 data.So 丢失了片段我想使用 popbackstack 是错误的方式,或者我可以覆盖一些方法,比如 onDestroy 以在我调用 popbackstack 方法时不删除片段.还是我必须在 onSaveInstanceState 中做一些事情来保存我的片段和数据? 我是 android 的新手,使用一些代码并参考了 link,所以我理解你的代码并学到一些东西会很感激。
这个方法可以帮助你在做的时候保留Fragment。
public static void SetFragment(Fragment mFragment, Context mcontext,String title)
{
String backStateName = mFragment.getClass().getName();
FragmentTransaction ft = masterFragmentManager.beginTransaction();
ft.replace(R.id.content_frame, mFragment,backStateName);
ft.addToBackStack(null);
ft.commit();
if (((AppCompatActivity)mcontext).getSupportActionBar() != null) {
((AppCompatActivity)mcontext). getSupportActionBar().setTitle(title);
}
}
这里允许查看Fragment popbackstack
ft.addToBackStack(null);
我想回答我的问题,所以如果有人来这里我会帮助他们。 我用添加、显示和隐藏解决了我的问题,所以片段保持活动状态而不是重新创建。(我不知道这是否是一个很好的性能解决方案)
manager=getFragmentManager(); //FragmentManager
HomeFragment selected=new HomeFragment();
int position1=position; //position in gridview 1-7
Object current_date= parent.getAdapter().getItem(position); //getting the selected date from the adapter as object
tag = formater1.format(current_date); //format the date
Fragment previous_fragment = manager.findFragmentByTag(previous);
if (previous_fragment!=null){
transaction= manager.beginTransaction();
transaction.hide(previous_fragment)
.commit();
}
if ( manager.findFragmentByTag(tag) == null){
transaction= manager.beginTransaction(); //FragmentTransaction
transaction.add(R.id.user_frame,selected,tag)
.commit();
}else {
Fragment my_fragment = manager.findFragmentByTag(tag);
transaction=manager.beginTransaction();
transaction.show(my_fragment)
.commit();
}
previous=tag;
previous_view=view;
previous_position=position;