更新到最新的支持存储库后,
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
我有一个活动,我使用以下方法切换片段:
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中删除以前的片段而不弹出当前片段?
我正在使用Fragments实现菜单导航.所以我从Home开始,然后用户可以导航到每个部分的不同部分和细节.
当用户更改部分时,我会在fragmentmanager backstack上调用pop,直到我到达Home,然后加载新部分.
这一切都按预期工作.但是我遇到了这个问题:
我已经迭代了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
我有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应用程序中 -
说我在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
?
几年前,当我尝试FragmentTransaction
在onActivityResult()
回调中提交内容时,我在我的一个应用程序中遇到了问题.谷歌搜索,我发现这个问题和答案,说
在
onActivityResult()
调用时,活动/片段的状态可能尚未恢复,因此在此期间发生的任何事务都将丢失.
我最终采用了相同答案推荐的解决方案来应用我的应用程序,生活很美好.然而,最近的实验表明,事情可能已经发生了变化,现在从内部投入可能是安全的.FragmentTransaction
onActivityResult()
(支持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
你好,我的问题如下,我有 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) 我有一个Activity
和六个不同的Fragments
附加.每个片段都有OnFragmentInteractionListener
接口,活动实现所有这些监听器以接收回调.它看起来有点乱,所以我感兴趣的是有一些模式/方法来简化这个并使它更优雅吗?
java android android-fragments android-activity fragmentmanager
我在片段类中有方法.我想从主要活动中调用该方法,但我不想使用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
我已经查看了Stackoverflow上的所有问题,但无法找到这个问题的唯一确定答案.如何将标记设置为aFragment
以便通过它检索getFragmentManager().findFragmentByTag()
?有人可以给出一个如何创建标签的简单代码示例Fragment
吗?