标签: fragmentmanager

片段必须是要从实例状态正确重新创建的公共静态类

更新到最新的支持存储库后,

compile 'com.android.support:appcompat-v7:24.2.0'
compile 'com.android.support:design:24.2.0'
compile 'com.android.support:percent:24.2.0'
compile 'com.android.support:recyclerview-v7:24.2.0'
Run Code Online (Sandbox Code Playgroud)

我得到了奇怪的例外.

java.lang.IllegalStateException: Fragment null must be a public static class to be  properly recreated from instance state.
at android.support.v4.app.BackStackRecord.doAddOp(BackStackRecord.java:435)
at android.support.v4.app.BackStackRecord.add(BackStackRecord.java:414)
at android.support.v4.app.DialogFragment.show(DialogFragment.java:154)
at com.androidapp.base.BaseActivity.showDialogFragment(BaseActivity.java:78)
at com.androidapp.MainActivity.showNewDialog(MainActivity.java:304)
at com.androidapp.MainActivity$6.onClick(MainActivity.java:228)
Run Code Online (Sandbox Code Playgroud)

在我的BaseActivity类中,我创建了一个可重用的片段,可以在扩展BaseActivty的 activity类中使用

public void showDialogFragment(DialogFragment newFragment) {
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        Fragment prev = getSupportFragmentManager().findFragmentByTag("dialog");
        if (prev != null) {
            ft.remove(prev);
        }
        ft.addToBackStack("dialog");
        newFragment.show(ft, "dialog");
    }
Run Code Online (Sandbox Code Playgroud)

回到MainActivty我用过像这样的片段,

public class MainActivity extends BaseActivity {

    @SuppressLint("ValidFragment")
        public void showNewDialog(int …
Run Code Online (Sandbox Code Playgroud)

android android-fragments android-dialogfragment android-support-library fragmentmanager

15
推荐指数
1
解决办法
2万
查看次数

如何从FragmentManager中删除以前的堆栈条目?

我有一个活动,我使用以下方法切换片段:

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中删除以前的片段而不弹出当前片段?

android android-fragments back-stack fragmentmanager

14
推荐指数
1
解决办法
9797
查看次数

FragmentManager popBackStack不会删除片段

我正在使用Fragments实现菜单导航.所以我从Home开始,然后用户可以导航到每个部分的不同部分和细节.

当用户更改部分时,我会在fragmentmanager backstack上调用pop,直到我到达Home,然后加载新部分.

这一切都按预期工作.但是我遇到了这个问题:

  1. 在onResume()上加载一个调用setHasOptionsMenu(true)的部分
  2. 加载另一个部分(旧部分,它是为了摆脱堆栈).我觉得没问题.没有菜单显示
  3. 离开应用程序(例如,转到Android Laucher活动)然后当我返回时,我看到正确的部分,但它显示了旧片段的菜单.

我已经迭代了backstack并打印了每个片段,并且它不是菜单中的片段.

我在onResume()方法上放了一个调试标记(setHasOptionsMenu(true)标记的地方),它确实进入了这里,所以片段它仍然在某处.

我想知道我做错了什么,我怎么能解决它,谢谢

更新:

我正在使用此代码加载新片段

fm.beginTransaction()
    .add(container, sectionFragment.getFragment())
    .addToBackStack(sectionFragment.getFragmentName())
    .commit();
Run Code Online (Sandbox Code Playgroud)

并删除:

private void clearStack(){
int count = fm.getBackStackEntryCount();
    while(count > 1){
        fm.popBackStack();
        count--;
    }
}
Run Code Online (Sandbox Code Playgroud)

注1:我正在使用add而不是替换,因为当我从详细信息部分导航回来时,我不想丢失我的片段的状态.当我加载另一个不同的部分,然后我调用clearStack将堆栈弹出到1,然后加载新的片段.最后,我调用executePendingTransactions()来完成从事务中删除片段.

注2:我看到它正在我的片段onDestroy()方法上进入,所以它被摧毁了.但我不知道为什么在Main活动恢复时会再次调用它.

android android-fragments fragmentmanager android-nested-fragment

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

Android onBackStackChanged()未调用

我有Activity类似下面的代码:

public class AuthenticatedMainActivity extends Activity implements FragmentManager.OnBackStackChangedListener{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        .............
        FragmentManager fragmentManager = getFragmentManager();           
        fragmentManager.beginTransaction().add(R.id.frame_container,fragment, "First").addToBackStack(null).commit();
    }

    private void switchFragment(Fragment fragment){            
      FragmentManager fragmentManager = getFragmentManager();
      fragmentManager.beginTransaction()
        .replace(R.id.frame_container, fragment).addToBackStack("Tag").commit();
    }

    @Override
public void onBackStackChanged() {
    System.out.println("====================================================changeeeeeeeeeeeeeeeeeeeeeeeeee");
}       
}
Run Code Online (Sandbox Code Playgroud)

但是,onBackStackChanged()在使用该switchFragment方法成功替换片段后,该方法永远不会被调用.

android android-fragments fragmentmanager

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

如何在活动中恢复片段后台堆栈(在后台应用程序被杀死后)

在Android应用程序中 -

说我在Activity- MyActivity,一次Fragment举行一个.

首先我将片段A加载到它(没有标签我将它添加到后面的堆栈中FragmentManager)

然后在某些时候我加载片段B(再次没有标签我把它添加到后面的堆栈FragmentManager)

然后在某些时候我加载了片段C(再次没有标签我把它添加到后面的堆栈FragmentManager)

popBackStack()用来启用后退按钮行为,所以每当我从Fragment C按回来时,流程就像:

片段C - > 片段B - > 片段A - > 关闭MyActivity ..

一切都很完美:-)

但如果我在片段C中并且应用程序在后台杀死(我 "设置"中使用了"不要保留活动标志")

在线返回 Fragment C加载到MyActivity中

但是FragmentManager后面的堆栈只包含Fragment C ..

后退按钮搞砸了

片段C - > 关闭MyActivity ..

为什么会这样?

如何正确恢复FragmentManager一个Activity

android android-fragments fragmentmanager

14
推荐指数
2
解决办法
7241
查看次数

在onActivityResult()中提交FragmentTransaction是否安全?

几年前,当我尝试FragmentTransactiononActivityResult()回调中提交内容时,我在我的一个应用程序中遇到了问题.谷歌搜索,我发现这个问题和答案,说

onActivityResult()调用时,活动/片段的状态可能尚未恢复,因此在此期间发生的任何事务都将丢失.

我最终采用了相同答案推荐的解决方案来应用我的应用程序,生活很美好.然而,最近的实验表明,事情可能已经发生了变化,现在从内部投入可能是安全的.FragmentTransactiononActivityResult()

(支持v4)的文档FragmentManager.beginTransaction()将事务的安全窗口定义为:

注意:只能在活动保存其状态之前创建/提交片段事务.如果您尝试在之后FragmentActivity.onSaveInstanceState()(以及之后FragmentActivity.onStart或之前)提交事务FragmentActivity.onResume(),您将收到错误.

阅读文档onActivityResult(),我明白了

您将在onResume()重新启动活动之前立即收到此电话.

这使我相信执行这些事务应该是安全的onActivityResult(),就像onStart()已经被调用的那样,将我置于安全窗口内.

我做了一个应用程序来测试它,我成功地看到了我创建并提交的对话框片段onActivityResult().我有相同的应用程序也记录活动生命周期回调,所以我可以检查他们的订单onStart(),然后onRestoreInstanceState(),我看到,然后onActivityResult()每次.

我错过了什么吗?或者框架已更改,onActivityResult()现在保证是片段交易的安全位置?此行为是否因API级别而异?

我发现了另一个问题和答案似乎与我的文档相同,但两者都超过一年,并没有特别指的是onActivityResult()交易的安全场所.

android android-fragments android-activity android-fragmentactivity fragmentmanager

14
推荐指数
1
解决办法
739
查看次数

setFragmentResult 不适用于 Click 侦听器

你好,我的问题如下,我有 2 个片段,一个使用 SetFragmentResultListener 接收,另一个使用 setFragmentResult 发送

问题是 setFragmentResult 不能在 OnClickListener 内部工作,但可以在外部工作

家长

 setFragmentResultListener("scannedCode") { requestKey, bundle ->
                val result = bundle.getString("code")
                Log.i("MYLOG-find","$result")
            }
Run Code Online (Sandbox Code Playgroud)

儿童 - 它有效

override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        val view = inflater.inflate(R.layout.fragment_scan, container, false)

            setFragmentResult("scannedCode", bundleOf("code" to  "pedro"))
        
        return view
    }
Run Code Online (Sandbox Code Playgroud)

孩子——这不起作用

 override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        val …
Run Code Online (Sandbox Code Playgroud)

android android-fragments retrofit fragmentmanager dagger-2

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

如何在一个Activity中正确处理多个片段交互监听器?

我有一个Activity和六个不同的Fragments附加.每个片段都有OnFragmentInteractionListener接口,活动实现所有这些监听器以接收回调.它看起来有点乱,所以我感兴趣的是有一些模式/方法来简化这个并使它更优雅吗?

java android android-fragments android-activity fragmentmanager

13
推荐指数
2
解决办法
7022
查看次数

如何从主要活动调用片段方法

我在片段类中有方法.我想从主要活动中调用该方法,但我不想使用FragmentById(或)FragmentByTag.

我的片段方法:

public void setItemFromDrawer(String sourceTag, String destTag) {
    //dosomething
}
Run Code Online (Sandbox Code Playgroud)

如何在不使用FragmentById(或)FragmentByTag的情况下从主活动调用上述方法?

java android android-fragments android-activity fragmentmanager

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

如何在Android中将标记设置为片段

我已经查看了Stackoverflow上的所有问题,但无法找到这个问题的唯一确定答案.如何将标记设置为aFragment以便通过它检索getFragmentManager().findFragmentByTag()?有人可以给出一个如何创建标签的简单代码示例Fragment吗?

android android-fragments fragmentmanager

11
推荐指数
1
解决办法
2万
查看次数