标签: back-stack

按下后退按钮时如何用片段A替换片段C?

我的场景:活动1由碎片A-> B-> C组成.使用以下代码添加所有碎片:

        FragmentManager fm = getSupportFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();
        ft.replace(R.id.content, fragment, TAG);
        ft.addToBackStack(TAG);
        ft.commit();
Run Code Online (Sandbox Code Playgroud)

现在,从片段C开始,我想直接返回片段A.因此,我ft.addToBackStack(TAG)在添加片段C时进行了评论.因此,当我从CI按下后退按钮时,直接在屏幕上显示片段A.

但是,片段C不会被A替换.事实上,这两个片段都是可见的.我该如何解决这个问题?

android android-fragments back-stack fragmenttransaction

34
推荐指数
2
解决办法
4万
查看次数

片段方法:attach(),detach(),remove(),replace(),popBackStack()

我对这些功能和它们的目的非常困惑.我观察到,使用新的replace()替换现有的片段.我们可以使用addToBackStack(null)将该片段放在后面的堆栈中,这样我们就可以回到之前显示的片段了.现在当一个片段被添加(或替换) - onAttach()- > onCreate()etc ....片段的方法按顺序调用.

现在,当我们remove()从我们的活动中调用片段时,片段的哪些函数被调用以及按什么顺序?

做什么attach()detach()做什么?是否detach()删除片段?并且这两个时attach()detach()使用时,该片段的功能调用,并且在该阶ΣΔ

还有什么呢popBackStack()?我的意思是当我们popBackStack()从我们的活动中使用片段时调用哪些函数?

什么时候onDestroy()调用?

谢谢.

android fragment android-fragments back-stack

33
推荐指数
2
解决办法
6万
查看次数

如果后备堆栈中已存在,则恢复活动而不是启动

Activity_1比方说,我经历了很多步骤

Activity_2 > Activity_3 ....在某些Activity_n我更改了一些相关的数据Activity_1并使用它来调用它

Intent intent = new Intent(Activity_n.this, Activity_1.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

刷新内容.但是后来我可以一直回到Activity_1我开始的地方,那里有旧数据.

相反,我希望使用上面的代码调用初始的Activity_1's onResume().或适当的旗帜

FLAG_ACTIVITY_CLEAR_TOP

考虑由活动组成的任务:A,B,C,D.如果D调用具有解析为活动B的组件的Intent的startActivity(),则C和D将完成,B接收给定的Intent,从而导致现在堆栈是:A,B.

那是'博士说的,但不是我得到的.

android back-stack

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

片段addToBackStack()和popBackStackImmediate()不起作用

我目前正在构建一个Android应用程序(14 <= SDK <= 21),使用一个ActionBarActivity或多个Fragments,例如ListFragmentMapFragment,它们在一个FrameLayout视图中交换.

ActionBarActivity自动替换/提交片段A.然后,当用户点击一个按钮时,托管活动替换/提交一个新的不同片段B.我的目标是让用户在按下后退按钮时返回片段A .

现在有些代码了.

主要活动

public class MainActivity extends ActionBarActivity implements StopFragment.OnFragmentInteractionListener,
    StopItemFragment.OnFragmentInteractionListener {
...

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        fragmentManager = getFragmentManager();
        fragmentManager.enableDebugLogging(true);
        ...
        if (fragmentManager.findFragmentById(R.id.content_frame) == null) {
            StopItemFragment list = StopItemFragment.newInstance(null); //A - extends ListFragment
            fragmentManager.beginTransaction()
                .replace(R.id.content_frame, list)
                .addToBackStack(null)
                .commit();
        }
        ...

        @Override
        public void onFragmentInteraction(String id) {
        selectItem(Integer.parseInt(id));
        }


       private void selectItem(int position) {
       StopFragment fragment = StopFragment.newInstance(null, null); …
Run Code Online (Sandbox Code Playgroud)

android android-fragments back-stack

26
推荐指数
3
解决办法
5万
查看次数

当活动被破坏时,活动背叛的不当行为

我有两个活动; 假设A和B activity A是有广播接收器注册侦听将完成活动A.我注册的广播接收器的特定事件 onCreate(),并摧毁它onDestroy()activity A.

为简单起见,有一个buttonactivity B名为"破坏活性的A".当用户点击时button,activity A应该销毁.

通常所有这些都运行顺利,没有任何问题,但问题出现在以下场景中:

1)假设我在activity B,我按Home键将应用程序移动到后台然后如果我使用其他资源繁重的应用程序,Android系统将杀死我的应用程序以释放内存.然后,如果我最近的任务打开我的应用程序时,activity B将被收回,这是onCreate(),onResume()等方法将被调用.现在我按button摧毁activity A,但活动A已经被破坏,所以activity AonCreate(),onResume()等方法将不会被调用之前,除非我去activity Aback button.因此broadcast receiver没有注册来监听事件.

2)当用户在设备的设置中从Developer选项中选择"Do not keep activities"时,会出现同样的问题.

我一直在寻找解决这个问题很长一段时间,但我无法找到合适的答案.处理这种情况的最佳方法是什么?这是Android的错误吗?这个问题应该有一些解决方案.

请帮我.

android broadcastreceiver android-lifecycle android-activity back-stack

25
推荐指数
2
解决办法
1402
查看次数

noHistory vs finish() - 哪个更受欢迎?

我不希望我的应用程序在按下按钮时显示很少Activity(说SplashScreenActivity)back.所以我noHistory=true在我的Manifest.xml用途中使用Activity如下所示:

<activity
    android:name="com.gokul.SplashScreenActivity"
    android:noHistory="true" >
</activity>
Run Code Online (Sandbox Code Playgroud)

noHistory我也可以finish()用我的SplashActivity.onPause()方法或任何我想要的方式调用,而不是设置,如下所示:

@Override
protected void onPause() {
    super.onPause();
    finish();
}
Run Code Online (Sandbox Code Playgroud)

两者都能完美地完成工作.但哪一个更好用,使用noHistory或打电话finish()

android activity-stack back-stack

22
推荐指数
2
解决办法
9734
查看次数

从BackStack保留ViewPager中的Fragment时重新加载WebView

这是一个Fragment包含a 的基本代码WebView.
WebFragment.java

public class WebFragment extends Fragment {
String TAG = "WebFragment";
private WebView webView;
private String currentUrl = "http://www.google.com";

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    return inflater.inflate(R.layout.webview_layout, null);
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    webView = (WebView) getView().findViewById(R.id.helloWebview);
    initWebView();
    webView.loadUrl(currentUrl);
}

@SuppressLint("SetJavaScriptEnabled")
private void initWebView() {
    webView.getSettings().setJavaScriptEnabled(true);
    webView.addJavascriptInterface(new JavaScriptInterface(), "HTMLOUT");
    webView.setWebViewClient(new WebViewClient() {
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            Log.e(TAG, "Loding...");
            super.onPageStarted(view, url, favicon); …
Run Code Online (Sandbox Code Playgroud)

android android-webview android-fragments android-viewpager back-stack

21
推荐指数
2
解决办法
7635
查看次数

如何在Android应用程序中找到后台堆栈活动?

我有一个活动的应用程序返回堆栈A - > B - > C - > D - > E.现在在活动E,我想知道我导航的后台堆栈活动.我怎么找到这个?

android activity-stack back-stack

20
推荐指数
3
解决办法
2万
查看次数

Fragment PopBackStack

我遇到一个奇怪的问题,同时使用Fragments并弹出它们.

我有一个片段活动:

Step1:我在起始命名片段A中的那个Activity的onCreate中附加了一个片段:

这是片段活动的onCreate

@Override
    protected void onCreate(Bundle savedBundleState) {
        super.onCreate(savedBundleState);
        setContentView(R.layout.activity_base_new);

        Fragement_Home home = new Fragement_Home();
        FragmentManager manager = getSupportFragmentManager();
        manager.beginTransaction().add(R.id.frameContent, home).addToBackStack("home").commit();
    }
Run Code Online (Sandbox Code Playgroud)

步骤:2之后,我附上了以下代码替换了Fragment:

Fragment_More moreFragment = new Fragment_More();
            FragmentManager manager = getSupportFragmentManager();
            manager.beginTransaction().replace(R.id.frameContent, moreFragment).addToBackStack("more").commit();
Run Code Online (Sandbox Code Playgroud)

第3步:在那之后我再次以相同的方式在Fragment_More上添加了一个片段:

Fragment_AboutRockstand termsConditions = new Fragment_AboutRockstand();
            getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.frameContent, termsConditions).addToBackStack("about_rockstand").commit();
Run Code Online (Sandbox Code Playgroud)

这是我的片段活动onBackPressedButton Lisetener:

@Override
public void onBackPressed() {
    FragmentManager fm = getSupportFragmentManager();
    Fragment f = fm.findFragmentById(R.id.frameContent);

 if(fm.getBackStackEntryCount() > 1){
         fm.popBackStack();
    } else{
        finish();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我得到的问题:

当我从第3步按回来时,它按照onBackPressed的描述成功地给了我之前的片段,它会回弹并将我带到前面的片段.但是从Fragment_More开始,当我再次按下时,它会显示空白的FRAGMENT内容.它从未显示我在活动的OnCreate中的第1步中添加的First Fragment.

请评论.我做错了什么?

谢谢

android android-fragments back-stack onbackpressed

20
推荐指数
1
解决办法
4万
查看次数

Android Reorder Fragment Backstack

我的导航抽屉中列出了许多页面/片段,用户可能经常在这些页面/片段之间切换,我希望它们在后台中,以便他们可以导航回来,但我只想在后台堆栈中每个片段的一个实例用户不必按下疯狂的次数退出应用程序.我无法弄清楚如何在没有删除页面的情况下有效地"重新排序"后台堆栈.

目前,当我更改页面时,我正在使用此代码更改片段并确保它仅在后面的堆栈中一次

  if (mFragMgr == null) {
      mFragMgr = getSupportFragmentManager();
  }

  String backStateName = fragmentDescriptor.name();
  boolean fragmentPopped = mFragMgr.popBackStackImmediate(backStateName, 0);
  if (!fragmentPopped){
      mFragMgr.beginTransaction()
      .remove((Fragment) mFragment)
      .replace(R.id.content_frame, (Fragment) mFragment)
      .addToBackStack(backStateName)
      .commit();
  }
Run Code Online (Sandbox Code Playgroud)

我在onBackPressed中使用此代码

  @Override
  public void onBackPressed() {
      if (mFragMgr.getBackStackEntryCount() > 0) {
          mFragMgr.popBackStackImmediate();
      } else {
          super.onBackPressed();
      }
  }
Run Code Online (Sandbox Code Playgroud)

这有效,但这意味着它删除了我不想删除的页面.例:

当我的用户在订单中访问6页A > B > C > D > E > C因为我正在进行删除时,我期望以下堆栈:

                            [E]    [C]
                     [D]    [D]    [E]
              [C]    [C]    [C]    [D]
       [B]    [B]    [B]    [B]    [B]
[A] -> [A] …
Run Code Online (Sandbox Code Playgroud)

android android-fragments back-stack

19
推荐指数
1
解决办法
5015
查看次数