我已经实现了Navigation Drawer,它是Activity的子类.我的应用程序中有很多片段.我的问题在这里
想象一下有3个片段:
Fragment_1:Fragment_2:Fragment_3
当我启动我的应用程序时,Fragment_1被加载当我点击Fragment_1上的一些组件时,我将导航到Fragment_2,依此类推.
所以它就像
Fragment_1> Fragment_2> Fragment_3
当我从Fragment_2按回键时,我被导航回Fragment_1但是当我从Fragment_3按回键时,我被导航回Fragment_1(而不是Fragment_2)
我在Back Key按下的应用程序中想要这样的东西
Fragment_1 <Fragment_2 <Fragment_3
我使用Fragment,FragmentManager,FragmentTransaction如下:
MyFragment fragment = new MyFragment();
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).addToBackStack(null)commit();
Run Code Online (Sandbox Code Playgroud)
我尝试在我的MainActivity中覆盖onBackPressed():
@Override
public void onBackPressed() {
getFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
int count = getFragmentManager().getBackStackEntryCount();
if (count == 0)
super.onBackPressed();
}
Run Code Online (Sandbox Code Playgroud) 嗨,我正在开发我正在使用的Android应用程序我正在使用单个Activity和3个片段.所以考虑我有3个片段AB C.当我从A切换到B时,我添加Fragment到Backstack和simillar for B to C.现在当我从C点击它时,它显示B和类似的B到A也是如此.
但事情是,当我从C到B或B来到A时,它不会调用onResume()或任何其他生命周期方法Fragment.
我想要做的每件事Fragment我都有不同的头衔ActionBar.所以,在我的代码中,当我从A移动到B或B到c时,我正在更改片段内的活动标题.但是,当我点击它时它不会改变.
实际问题是什么?为什么从后台弹出后它没有呼唤onResume()我Fragment?我该如何解决这个问题?需要帮忙.谢谢.
我看过这篇文章,但这里发布的解决方案对我不起作用:在backstack中获取最新的片段
当我替换另一个片段时,我使用:
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction ft = manager.beginTransaction();
ft.replace(android.R.id.tabcontent, fragment, tag);
ft.addToBackStack(null);
ft.commit();
Run Code Online (Sandbox Code Playgroud)
所以,请注意我正在使用标签来检测任何片段.
我的问题尤其如下:
假设我有fragment_A,fragment_B和fragment_C.我可以从fragment_A或fragment_B获取fragment_C,并且根据调用的父级,我必须做一些特别的事情.所以,我再次需要恢复后堆栈中的最后一个FRAGMENT.
当我尝试做的时候:
FragmentManager fm = getSupportFragmentManager();
for(int entry = 0; entry < fm.getBackStackEntryCount(); entry++){
String ide = fm.getBackStackEntryAt(entry).getName();
Log.i("TAG", "Found fragment: " + ide);
}
Run Code Online (Sandbox Code Playgroud)
我得到零.如果我使用getId()代替,我得到数字,所以我尝试做:
int id = fm.getBackStackEntryAt(entry).getId();
Fragment fragment = fm.findFragmentById(id);
Log.i("TAG", "Found fragment: " + fragment.getTag());
Run Code Online (Sandbox Code Playgroud)
但我得到了空的..我不知道还能做什么,所以任何帮助将不胜感激.
编辑:我在onBackPressed(){...}中调用此方法
我在stackoverflow上读到的其他问题都没有能够解决我的问题.据我所知,我正在做的一切正确.
我有一个带片段的主/细节流.
创建主活动后,主片段将加载以下代码:
Fragment frag;
frag = new MainListFragment();//<-- **the master fragment**
FragmentManager fm = getFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();
transaction.replace(R.id.fragment_container, frag);
Log.d("My Debug Bitches", "stack:" + fm.getBackStackEntryCount());
transaction.commit();
Run Code Online (Sandbox Code Playgroud)
主片段有一个ListView; 单击列表项会显示详细信息片段,如下所示:
@Override
public void onListItemClick(ListView listView, View view, int position, long id) {
super.onListItemClick(listView, view, position, id);
FragmentManager fm = getFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();
SubListFragment frag = new SubListFragment();//<-- **the detail fragment**
transaction.replace(R.id.fragment_container, frag);
transaction.addToBackStack(null);
transaction.commit();
fm.executePendingTransactions();
Log.d("My Debug Bitches", "stack:" + fm.getBackStackEntryCount());
}
Run Code Online (Sandbox Code Playgroud)
现在,根据LogCat,我从主片段导航到细节片段后,BackStackEntryCount 从0变为1 …
我正在尝试在我的Android应用程序中实现深层链接.我一直在关注这个指南.我在Android清单中启动了Android活动并进行了intent-filter:
<activity
android:name=".MyActivity"
android:parentActivityName=".MainActivity" >
<intent-filter android:label="@string/filter_title_deep_link">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="com.example" />
</intent-filter>
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".MainActivity"/>
</activity>
Run Code Online (Sandbox Code Playgroud)
我从adb产生这个意图:
adb shell am start -W -a android.intent.action.VIEW -d "com.example://test" com.example
Run Code Online (Sandbox Code Playgroud)
正在使用正确的意图数据创建活动,并按预期运行.但是,按下后退按钮后,应用程序退出.MainActivity正如parentActivityNameAndroid清单中所指出的那样,我期待构建后备栈.显然事实并非如此.
在这种情况下,如何将父活动添加到后台堆栈?
我想,如果我可以使用一个TaskStackBuilder如图所示这里在通知的情况下,但不知道它是如何工作的.
也许我应该有一个中间Activity来构建主要活动,例如:
TaskStackBuilder.create(this)
.addParentStack(MyActivity.class)
.addNextIntent(new Intent(this, MyActivity.class))
.startActivities();
Run Code Online (Sandbox Code Playgroud)
?
android deep-linking android-intent android-activity back-stack
我有一个活动,我使用以下方法切换片段:
public void setCurrentFragment(Fragment fragment) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.setCustomAnimations(R.anim.slide_left_right_in, R.anim.slide_left_right_out, R.anim.slide_right_left_in, R.anim.slide_right_left_out);
transaction.replace(R.id.contentFrameLayout, fragment, Integer.toString(fragmentId++));
transaction.addToBackStack(Integer.toString(fragmentId));
transaction.commit();
}
Run Code Online (Sandbox Code Playgroud)
我的导航堆栈看起来像这样:
N-2 - > N-1 - > N.
当某个片段N'打开'时,我想要从后台堆栈中移除前一个(N-1),所以当我按下"后退"时我想要恢复N-2片段.
当我在N片段中调用FragmentManager.popBackStack(..)时,它会删除N和N-1片段.
在切换到N片段之前,我试图在N-1片段中调用popBackStack(..).但是在那种情况下,N-2片段被恢复,并且仅在显示N片段之后.
我的问题是:有没有办法从backstack中删除以前的片段而不弹出当前片段?
我在我的应用程序中打开一个链接,一旦按下后我想显示HomePage以保留用户更多时间.我一直在努力实现这一目标但却无法做到这一点.我将homeLauncher活动作为我的top和baseActivity.
DeepLink Tap>打开所需的活动>用户按下后退按钮>检查其上一个活动但不是homeActivity>如果是,请将用户导航到homeActivity.
尝试以下代码:
@Override
public void onBackPressed() {
ActivityManager mngr = (ActivityManager) getSystemService( ACTIVITY_SERVICE );
List<ActivityManager.RunningTaskInfo> taskList = mngr.getRunningTasks(10);
if(taskList.get(0).numActivities == 1 && taskList.get(0).topActivity.getClassName().equals(this.getClass().getName())){
//// This is last activity
}
else{
//// There are more activities in stack
}
super.onBackPressed();
}
Run Code Online (Sandbox Code Playgroud)
我也试过isTaskRoot但结果是一样的.它没有给出正确的答案.请帮助
android android-intent android-activity back-stack activity-manager
我已经在SO上做了一些阅读和搜索,但找不到清除当前活动堆栈的方法.我的应用程序的上下文是由后台服务/通知启动的活动.
想象一下,我的应用程序允许您组织人员列表.几个小时前,您正在"查看"活动中查看人员X,现在这是您的堆栈顶部.在将来的某个时刻,服务会触发并为人Y弹出一个新的"通知"活动.从那里你可以编辑人Y的详细信息.
当你完成这个活动时,弹出堆栈并最终查看人X将是一个令人困惑的用户体验.理想情况下,我想回到用户正在做的任何事情(电子邮件等...),或者至少我的应用程序的主页.
我尝试启动"通知",FLAG_ACTIVTY_NEW_TASK但似乎没有帮助:当任务完成时,它只是回到上一个任务.我想要的似乎是Android 3的新功能FLAG_ACTIVITY_CLEAR_TASK,这在之前的SDK中并不存在.
有没有人有建议去做到这一点?
我正在处理片段事务,而backstack是这样的:
fragA => fragB => fragC => fragD
Run Code Online (Sandbox Code Playgroud)
我想从碎片回来之后回到fragA
fragD => onBackPress => fragA
Run Code Online (Sandbox Code Playgroud)
所以,我试过像:
getChildFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
Run Code Online (Sandbox Code Playgroud)
但它清除了所有的后台堆叠,如何将第一个碎片保留在后台堆叠中?非常感谢
android android-fragments back-stack android-fragmentactivity fragment-backstack
我在我的项目中使用了多个片段.我想保存Fragment的状态并在我回到此状态时恢复此状态.在此片段中,我显示了多个图像,这些图像在按钮点击时发生变 我使用以下代码:
String backStateName = fragment.getClass().getName();
FragmentManager fragmentManager = getSupportFragmentManager();
boolean fragmentPopped = fragmentManager.popBackStackImmediate(backStateName, 0);
if (!fragmentPopped) {
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.container_body, fragment);
fragmentTransaction.addToBackStack(backStateName);
fragmentTransaction.commit();
}
Run Code Online (Sandbox Code Playgroud)
它工作正常并保存状态,但它不显示以前的图像.
任何帮助,建议或教程将受到高度赞赏.谢谢.
android savestate android-fragments back-stack fragment-backstack