标签: back-stack

清除整个历史记录堆栈并在Android上启动新活动

是否可以在堆栈上启动活动,清除之前的整个历史记录?

情况

我有一个活动堆栈,可以是A-> B-> C或B-> C(屏幕A选择用户令牌,但许多用户只有一个令牌).

在屏幕C中,用户可以采取使屏幕B无效的动作,因此应用程序想要将它们带到屏幕A,而不管它是否已经在堆栈中.屏幕A应该是我的应用程序中堆栈上唯一的项目.

笔记

还有许多其他类似的问题,但我没有发现任何可以回答这个问题的问题.我试过调用getParent().finish()- 这总是导致空指针异常.FLAG_ACTIVITY_CLEAR_TOP仅在活动已在堆栈上时才有效.

android android-activity back-stack

313
推荐指数
10
解决办法
19万
查看次数

以编程方式返回到Backstack中的上一个片段

假设我有一个以编程方式添加了片段的活动:

private void animateToFragment(Fragment newFragment, String tag) {
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.replace(R.id.fragment_container, newFragment, tag);
    ft.addToBackStack(null);
    ft.commit();
}
Run Code Online (Sandbox Code Playgroud)

返回到可见的上一个片段的最佳方法是什么?

在Android按钮点击时发现了Trigger后退按钮功能,但我认为模拟后退键事件不是正确的方法(我也无法让它工作):

dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK));
Run Code Online (Sandbox Code Playgroud)

打电话finish()只关闭我不感兴趣的活动.

有没有更好的方法来解决这个问题?

android android-fragments back-stack

203
推荐指数
8
解决办法
25万
查看次数

如何防止回到以前的活动?

当在电话上按下BACK按钮时,我想阻止特定活动返回到之前的活动.

具体来说,我有登录和注册屏幕,都会HomeScreen在成功登录/注册时启动一个新活动.启动HomeScreen后,我想通过按BACK键阻止用户返回登录或注册屏幕.

我尝试过使用Intent.FLAG_ACTIVITY_NO_HISTORY,但由于应用程序有Facebook集成,当使用"使用Facebook登录"时,Facebook应该返回初始登录屏幕,因此我应该保留这些活动的历史记录.

HomeScreen当按下按钮并且我使用时,我想到覆盖BACK按钮的行为以直接完成应用程序

@Override
public void onBackPressed() {
    finish();
}
Run Code Online (Sandbox Code Playgroud)

但这也行不通.

android back activity-stack back-stack

196
推荐指数
6
解决办法
16万
查看次数

在backstack上不调用片段onResume()和onPause()

我在一个活动中有多个片段.在按钮上单击我开始一个新片段,将其添加到backstack.我自然希望调用onPause()当前片段和onResume()新片段的方法.好吧,它没有发生.

LoginFragment.java

public class LoginFragment extends Fragment{
  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
      final View view  =   inflater.inflate(R.layout.login_fragment, container, false);
      final FragmentManager mFragmentmanager =  getFragmentManager();

      Button btnHome  = (Button)view.findViewById(R.id.home_btn);
      btnHome.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view){
           HomeFragment fragment    = new HomeFragment();
           FragmentTransaction ft2   =  mFragmentmanager.beginTransaction();
           ft2.setCustomAnimations(R.anim.slide_right, R.anim.slide_out_left
                    , R.anim.slide_left, R.anim.slide_out_right);
           ft2.replace(R.id.middle_fragment, fragment);
           ft2.addToBackStack(""); 
           ft2.commit();    
         }
      });
  }

  @Override
  public void onResume() {
     Log.e("DEBUG", "onResume of LoginFragment");
     super.onResume();
  }

  @Override
  public void onPause() …
Run Code Online (Sandbox Code Playgroud)

android onresume android-fragments back-stack

183
推荐指数
5
解决办法
23万
查看次数

添加到后台堆栈时,如何维护片段状态?

我写了一个在两个片段之间切换的虚拟活动.当您从FragmentA转到FragmentB时,FragmentA会被添加到后台堆栈中.但是,当我返回FragmentA(通过按回)时,会创建一个全新的FragmentA,并且它所处的状态将丢失.我感觉我跟这个问题一样,但我已经包含了一个完整的代码示例来帮助解决问题:

public class FooActivity extends Activity {
  @Override public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    final FragmentTransaction transaction = getFragmentManager().beginTransaction();
    transaction.replace(android.R.id.content, new FragmentA());
    transaction.commit();
  }

  public void nextFragment() {
    final FragmentTransaction transaction = getFragmentManager().beginTransaction();
    transaction.replace(android.R.id.content, new FragmentB());
    transaction.addToBackStack(null);
    transaction.commit();
  }

  public static class FragmentA extends Fragment {
    @Override public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
      final View main = inflater.inflate(R.layout.main, container, false);
      main.findViewById(R.id.next_fragment_button).setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
          ((FooActivity) getActivity()).nextFragment();
        }
      });
      return main;
    } …
Run Code Online (Sandbox Code Playgroud)

android android-fragments back-stack

150
推荐指数
6
解决办法
13万
查看次数

如果存在,如何从BackStack恢复Fragment

我正在学习如何使用片段.我有三个实例Fragment在类的顶部初始化.我将片段添加到这样的活动:

声明和初始化:

Fragment A = new AFragment();
Fragment B = new BFragment();
Fragment C = new CFragment();
Run Code Online (Sandbox Code Playgroud)

更换/添加:

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame, A);
ft.addToBackStack(null);
ft.commit();
Run Code Online (Sandbox Code Playgroud)

这些片段工作正常.每个片段都附加到活动,并保存到后台堆栈没有任何问题.

所以当我启动AC,然后B,堆栈看起来像这样:

| |
|B|
|C|
|A|
___
Run Code Online (Sandbox Code Playgroud)

当我按下"后退"按钮时,会B被摧毁并C恢复.

但是,当我A第二次启动片段时,它不会从后端堆栈中恢复,而是添加到后端堆栈的顶部

| |
|A|
|C|
|A|
___
Run Code Online (Sandbox Code Playgroud)

但我想恢复A并销毁它上面的所有碎片(如果有的话).实际上,我只是喜欢默认的后台堆栈行为.

我该如何做到这一点?

预期:( A应该恢复,顶部碎片应该销毁)

| |
| |
| |
|A|
___
Run Code Online (Sandbox Code Playgroud)

编辑:(由A - C建议)

这是我尝试的代码:

private void selectItem(int position) { …
Run Code Online (Sandbox Code Playgroud)

android android-fragments back-stack

140
推荐指数
2
解决办法
16万
查看次数

Android Fragment返回堆栈的问题

我对android片段后台堆栈的工作方式存在很大的问题,并且非常感谢所提供的任何帮助.

想象一下,你有3个碎片

[1] [2] [3]

我希望用户能够[1] > [2] > [3]在返回的路上导航(按下后退按钮)[3] > [1].

正如我想象的那样,这将通过addToBackStack(..)在创建将片段[2]带入XML中定义的片段持有者的事务时不调用来实现.

这样的现实似乎如果我不想[2]再次出现当用户按下按钮时[3],我不能addToBackStack在显示片段的事务中调用[3].这似乎完全违反直觉(可能来自iOS世界).

无论如何,如果我这样做,当我离开[1] > [2]并按回来时,我会按[1]预期返回.

如果我去[1] > [2] > [3],然后按回我跳回[1](如预期的那样).现在,当我尝试[2]再次跳转时,会发生奇怪的行为[1].首先[3]是在[2]进入视图之前简要显示.如果我在此时按回按钮[3],如果我再次按回来,则退出该应用程序.

任何人都可以帮我理解这里发生的事情吗?


这是我的主要活动的布局xml文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="fill_parent"
          android:layout_height="fill_parent"
          android:orientation="vertical" >

<fragment
        android:id="@+id/headerFragment"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        class="com.fragment_test.FragmentControls" >
    <!-- Preview: layout=@layout/details -->
</fragment>
<FrameLayout
        android:id="@+id/detailFragment" …
Run Code Online (Sandbox Code Playgroud)

android android-fragments back-stack

119
推荐指数
5
解决办法
13万
查看次数

如何使用不同的意图启动活动时,如何防止活动的多个实例

当我使用Android市场上的"打开"按钮启动时,我在应用程序中遇到了一个错误.似乎从市场上推出它会使用不同的意图,然后从手机的应用程序菜单中启动它.这导致启动相同活动的多个副本,这些副本彼此冲突.

例如,如果我的应用程序包含ABC活动,则上述问题可能会导致堆栈ABCA.

我尝试使用Intent所有活动来解决这个问题,但每当我点击HOME时,它都会产生不必要的副作用,即将活动堆栈清除为root.

示例: ABC - > HOME - > A当我需要的是ABC - > HOME - > ABC

在使用HOME时,是否有一种防止启动相同类型的多个活动而不重置根活动的好方法?

android activity-stack google-play back-stack

116
推荐指数
3
解决办法
7万
查看次数

如何在BackStack上反转片段动画?

我认为当使用以下代码使用片段时按下后退按钮时,系统会反转backstack上的动画:

FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.setCustomAnimations(R.anim.slide_in, R.anim.hyperspace_out);
ft.replace(R.id.viewContainer, new class(), "layout").addToBackStack(null).commit();
Run Code Online (Sandbox Code Playgroud)

android android-animation android-fragments back-stack

112
推荐指数
3
解决办法
4万
查看次数

Android:从后台堆栈中删除所有以前的活动

当我点击我的个人资料活动中的退出按钮时,我想将用户带到登录页面,他需要使用新的凭据.

因此我使用了这段代码:

Intent intent = new Intent(ProfileActivity.this,
        LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

在" onButtonClick注销"按钮中.

但问题是,当我点击登录活动上的设备后退按钮时,它会将我带到ProfileActivity.当我按下LoginActivity上的设备后退按钮时,我希望应用程序关闭.

我究竟做错了什么?

我还在LoginActivityandroid:launchMode="singleTop"的清单中添加了

谢谢

android back-stack

104
推荐指数
8
解决办法
13万
查看次数