我有一个带有双窗格的活动:左侧的菜单项列表(片段M)和右侧当前所选项目的详细信息(片段D).
当用户选择片段D中的项目时,片段D将被另一个片段替换(让我们称之为D1).当用户选择片段D1中的项目时,片段D1将被另一个片段替换(让我们称之为D2),依此类推.当然,当用户按下后退按钮时,她可以返回片段历史记录:D2-> D1-> D.
我的问题是:如何在配置更改时保存和恢复完整的片段后备栈(特别是在屏幕方向上)?
我之前没有其他人遇到这个问题似乎很奇怪,但我在Google和Stack Overflow上的搜索过程中没有发现任何相关信息.如果我错过任何相关的帖子,请告诉我.
我知道我可以简单地将android:configChanges="orientation|screenSize"属性添加到我的活动中以避免活动娱乐,但我根本无法做到这一点.
我不能这样做的原因是我使用Action Bar Sherlock(第4节)来实现向后兼容性,并且该组件需要活动重新创建才能在配置更改时正常运行,AFAIK.
如果有其他方法重新创建Action Bar Sherlock组件而不破坏并重新创建活动,请告诉我.
提前致谢.
我有一个名为HomeActivity的活动,它有一个SurfaceView并显示一个摄像头预览图片.如果您正在启动/重新启动它,此活动会很安静并且感觉很慢.
所以我做了一些调查,发现,不知何故总是调用onCreate方法.在我看来,如果活动已经开始,这不应该发生?
该文件说:第一次创建活动时调用.这是您应该执行所有常规静态设置的地方:创建视图,将数据绑定到列表等.此方法还为您提供包含活动先前冻结状态的Bundle(如果有).始终紧跟onStart().
这是处理返回的方法:
protected void gotoHome() {
final Intent intent = new Intent(SomeOtherActivity.this, HomeActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
Run Code Online (Sandbox Code Playgroud)
编辑:
以下是我离开HomeActivity的方式......没什么特别的:
final Intent i = new Intent(HomeActivity.this, SomeOtherActivity.class);
startActivity(i);
Run Code Online (Sandbox Code Playgroud) 我正在使用ViewPager在我的Android应用程序中实现滑动.但是,我想在用户使用后退按钮而不是结束活动时显示前一个片段.有没有办法做到这一点?谢谢塞巴斯蒂安
我有一个标题栏(有点像菜单)和4个片段(MAIN,A,B,C),其中MAIN应该是backstack的'main/root'片段.
我遇到的问题是当用户通过菜单进行例如MAIN> A> B> C.如果我只是使用backstack它将按相反的顺序进行,我不想要.无论用户如何导航到其中一个,我都需要返回按钮返回MAIN.

我当前的代码(这是错误的,它不在MAIN时退出应用程序,当前片段从其他非MAIN片段切换)看起来像这样:
private void SwitchFragment(Fragment pFragment)
{
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.main_fl_fragmentcontainer, pFragment);
if (_CurrentFragment == _Frag_Main)
ft.addToBackStack(null);
ft.commit();
_CurrentFragment = pFragment;
}
Run Code Online (Sandbox Code Playgroud) 当方向更改时,应用程序遇到以下问题:
什么有效:在旋转屏幕之前,一切都按照我想要的方式工作.
EditActivity目的:编辑集合和项目字段.
以编程方式创建此活动的片段:
初始布局:FragmentA位于FragmentB的顶部,每个都位于自己的FrameLayouts中.
当用户单击FragmentB的listview项时:将FragmentA替换为FragmentC以允许用户编辑该项的字段.现在FragmentC位于FragmentB之上.
这似乎是一个非常简单的概念:活动的顶部用于编辑整个集合的属性或集合中的单个项目.我觉得我没有对布局做过任何奇妙的事情,所以我有点困惑的是,电话(模拟器)的简单旋转会导致这些问题,我正在尝试修复这样一个卑鄙的时间.
为什么Android Fragment Guide示例对我不起作用:他们的示例与我正在做的非常相似,但是他们的详细信息片段要么在新活动中打开,要么在当前活动中的自己的Frame中打开,他们不做任何事情交换片段所以我无法收集他们如何使用onSaveIstanceState来保存可见的片段,然后在onCreate中使用该信息来重新创建在方向更改之前存在的UI.
编辑:通过放弃并将listfragment放入XML中解决了一个问题,这解决了永久旋转"加载..."问题.
android android-configchanges android-fragments back-stack android-framelayout
我创建了3个片段(FragmentA,FragmentB,FragmentC)和一个MainActivity.每个片段中都有一个按钮,它将自己替换为FragmentC的下一个片段.
我正在替换FragmentA(with)FragmentB(然后是)FragmentC.
从FragmentA到FragmentB的事务使用以下函数
@Override
public void fragmentreplacewithbackstack(Fragment fragment, String tag) {
FragmentManager fragmentManager=getSupportFragmentManager();
FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.contner,fragment , tag);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
// fragmentManager.executePendingTransactions();
}
Run Code Online (Sandbox Code Playgroud)
从FragmentB到FragmentC的事务使用以下函数
public void fragmentreplace(Fragment fragment,String tag){
FragmentManager fragmentManager=getSupportFragmentManager();
FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.contner,fragment , tag);
fragmentTransaction.commit();
}
Run Code Online (Sandbox Code Playgroud)
问题是当我从FragmentC按下按钮时,FragmentC和FragmentA相互重叠.

我将片段事务添加到后台堆栈时遇到问题.我有一个Main活动,我在其中使用Menu Fragment填充我的布局:
public class MainActivity extends ActionBarActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getFragmentManager().beginTransaction().add(R.id.frag_container, new MainMenuFragment()).commit();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in …Run Code Online (Sandbox Code Playgroud) 我有一个有很多活动的应用程序.其中有InitialActivity加载核心数据.这是一个启动器活动,如果没有加载的数据,下一个活动都无法生存.
所以我启动应用程序,InitialActivity正在加载数据,然后导航到MainActivity然后我正在浏览一些FarAwayActivity.然后我转向其他应用程序(其中一些是重型游戏),我的应用程序在后台被杀死.我已经在我的日志中插入了日志调用Application.onCreate(),当我切换回应用程序时,我可以看到它再次被调用.所以我确定应用程序在后台被杀死了.但Android带来了最后一个FarAwayActivity顶部,它立即崩溃,因为所有加载的数据都是空的.
所以问题是:我怎样才能告诉应用程序从InitialActivity什么时候开始(并且只有当它被杀死和恢复时)?类似于"忘记我的背堆",但可能是自动地,在清单中.
我已经阅读并尝试了Activity标记文档中的所有内容,但没有任何内容符合我的期望.最接近的是android:clearTaskOnLaunch="true",但是当从桌面重新启动应用程序时,它会清除堆栈上的所有其他活动(并且应用程序尚未被杀死,因此所有数据都可用).为了清楚起见,我想在应用程序实际被杀之后才开始使用InitialActivity.
我已经为我的片段添加了自定义键盘,现在我想在背面按下时实现关闭键盘.
class CustomKeyboard
{
public void init(Context context) {
//...
FragmentManager fragmentManager = ((Activity) context).getFragmentManager();
boolean fragmentPopped = fragmentManager.popBackStackImmediate(TAG, 0);
if (!fragmentPopped) {
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.addToBackStack(TAG);
fragmentTransaction.commit();
}
}
}
Run Code Online (Sandbox Code Playgroud)
init每次屏幕旋转时都会出现问题,因为我创建了CustomKeyboardpublic void onActivityCreated(final Bundle savedInstanceState)
fragmentPopped=false 每次都可以将CustomKeyboard添加到BackStack中多次.
我的问题:
如果不使用getBackStackEntryCount()方法,是否可以将BackStackEntry添加到BackStack
?
在我的应用程序中,我创建了一个启动Details Activity的通知.我想将此活动添加到当前任务(或后台堆栈)的顶部.例如,我希望应用程序任务(后台堆栈)的行为如下:
但是我得到了这个:
我没有使用FLAG_ACTIVITY_CLEAR_TASK和FLAG_ACTIVITY_NEW_TASK标志.我该怎么办?
编辑:第一张图片只是一个例子.我认为问题的标题是完全明确的.我想在当前堆栈的顶部添加Details Activity,而不是从新任务开始.
这就是我创建的方式PendingIntent:
// Details activity intent
Intent intent = new Intent(context, DetailsActivity.class);
intent.putExtra(Com.KEY_ID, event.getId());
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
intent, PendingIntent.FLAG_UPDATE_CURRENT);
Run Code Online (Sandbox Code Playgroud)
这是显而易见的:
<activity
android:name=".MainActivity"
android:label="@string/app_name_system"
android:launchMode="singleTop"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".NoteActivity"
android:label="@string/app_name_system"
android:theme="@style/AppTheme.NoActionBar"
android:windowSoftInputMode="stateHidden" />
<activity
android:name=".DetailsActivity"
android:launchMode="singleTop"
android:label="@string/app_name_system"
android:theme="@style/AppTheme.NoActionBar" />
Run Code Online (Sandbox Code Playgroud)