标签: back-stack

Android onConfigurationChanged:如何保存和恢复片段后端堆栈?

我有一个带有双窗格的活动:左侧的菜单项列表(片段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组件而不破坏并重新创建活动,请告诉我.

提前致谢.

android onconfigurationchanged back-stack

8
推荐指数
2
解决办法
5037
查看次数

如果有意图导航,则始终调用onCreate

我有一个名为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)

android activity-stack back-stack

8
推荐指数
1
解决办法
8238
查看次数

使用BackStack与ViewPager

我正在使用ViewPager在我的Android应用程序中实现滑动.但是,我想在用户使用后退按钮而不是结束活动时显示前一个片段.有没有办法做到这一点?谢谢塞巴斯蒂安

android android-viewpager back-stack

8
推荐指数
3
解决办法
7541
查看次数

Android片段导航和backstack

我有一个标题栏(有点像菜单)和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)

navigation android android-fragments back-stack

8
推荐指数
1
解决办法
5529
查看次数

配置后从backstack更改片段现在共享FrameLayout?

应用问题:

当方向更改时,应用程序遇到以下问题:

  • FragmentA和FragmentC现在都占用了FrameLayout容器.

什么有效:在旋转屏幕之前,一切都按照我想要的方式工作.

活动描述简要说明:

EditActivity目的:编辑集合和项目字段.

以编程方式创建此活动的片段:

  • FragmentA - 用于编辑集合字段的片段
  • FragmentB - 集合中项目的ListFragment
  • FragmentC - 用于编辑项目字段的片段.

初始布局: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

8
推荐指数
1
解决办法
7028
查看次数

碎片在后退按钮上重叠

我创建了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相互重叠.

如下屏幕

android overlap overlapping android-fragments back-stack

8
推荐指数
1
解决办法
6883
查看次数

按下后不会返回上一个片段

我将片段事务添加到后台堆栈时遇到问题.我有一个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)

android android-fragments back-stack

8
推荐指数
2
解决办法
6355
查看次数

当应用程序对象被系统杀死时清除堆栈

我有一个有很多活动的应用程序.其中有InitialActivity加载核心数据.这是一个启动器活动,如果没有加载的数据,下一个活动都无法生存.

所以我启动应用程序,InitialActivity正在加载数据,然后导航到MainActivity然后我正在浏览一些FarAwayActivity.然后我转向其他应用程序(其中一些是重型游戏),我的应用程序在后台被杀死.我已经在我的日志中插入了日志调用Application.onCreate(),当我切换回应用程序时,我可以看到它再次被调用.所以我确定应用程序在后台被杀死了.但Android带来了最后一个FarAwayActivity顶部,它立即崩溃,因为所有加载的数据都是空的.

所以问题是:我怎样才能告诉应用程序从InitialActivity什么时候开始(并且只有当它被杀死和恢复时)?类似于"忘记我的背堆",但可能是自动地,在清单中.

我已经阅读并尝试了Activity标记文档中的所有内容,但没有任何内容符合我的期望.最接近的是android:clearTaskOnLaunch="true",但是当从桌面重新启动应用程序时,它会清除堆栈上的所有其他活动(并且应用程序尚未被杀死,因此所有数据都可用).为了清楚起见,我想在应用程序实际被杀之后才开始使用InitialActivity.

android back-stack

8
推荐指数
1
解决办法
563
查看次数

如果不存在,如何将BackStackEntry添加到BackStack

我已经为我的片段添加了自定义键盘,现在我想在背面按下时实现关闭键盘.

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 ?

android back-stack fragment-backstack

8
推荐指数
1
解决办法
629
查看次数

单击通知时如何保留当前的后台堆栈(或任务)?

在我的应用程序中,我创建了一个启动Details Activity的通知.我想将此活动添加到当前任务(或后台堆栈)的顶部.例如,我希望应用程序任务(后台堆栈)的行为如下:

在此输入图像描述

但是我得到了这个:

在此输入图像描述

我没有使用FLAG_ACTIVITY_CLEAR_TASKFLAG_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)

android android-notifications back-stack android-task

8
推荐指数
1
解决办法
1242
查看次数