我需要一些帮助。em以这种方式向活动添加片段。问题是每次调用openFragment时,它都会创建片段并添加。这是显而易见的。问:我做了什么修改,所以它只能添加一次片段。在下一次使用相同的片段标记调用时,它不会执行任何操作。
案例:第一次按下按钮添加片段并显示。我再按一次同样的按钮,它没有反应。
public static void openFragment(Activity activity, Fragment fragment) {
FragmentManager fragmentManager = ((ActionBarActivity) activity)
.getSupportFragmentManager();
FragmentTransaction ftx = fragmentManager.beginTransaction();
ftx.addToBackStack(fragment.getClass().getSimpleName());
ftx.setCustomAnimations(R.anim.slide_in_right,
R.anim.slide_out_left, R.anim.slide_in_left,
R.anim.slide_out_right);
ftx.add(R.id.main_content, fragment);
ftx.commit();
}
使用此方法检查是否已添加片段:
if(!Fragment.isAdded()){
//add fragment
}
使用FragmentTransaction.replace()
代替FragmentTransaction.add()
:
这本质上与调用当前添加的所有片段(使用相同的containerwid添加)的remove(Fragment)
相同,然后使用此处给出的相同参数添加(int,Fragment,String)。
第一次调用FragmentTransaction。replace()将简单地添加片段,因为没有要删除的片段。
这是解决方案,它只允许您在堆栈中添加一次片段,否则它会从堆栈中弹出非常相同的片段。
public static void openFragment(Activity activity, Fragment fragment) {
String fragmentTag = fragment.getClass().getName();
FragmentManager fragmentManager= ((ActionBarActivity) activity)
.getSupportFragmentManager();
boolean fragmentPopped = fragmentManager
.popBackStackImmediate(fragmentTag , 0);
if (!fragmentPopped && fragmentManager.findFragmentByTag(fragmentTag) == null) {
FragmentTransaction ftx = fragmentManager.beginTransaction();
ftx.addToBackStack(fragment.getClass().getSimpleName());
ftx.setCustomAnimations(R.anim.slide_in_right,
R.anim.slide_out_left, R.anim.slide_in_left,
R.anim.slide_out_right);
ftx.add(R.id.main_content, fragment);
ftx.commit();
}
}
slide_in_right
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="true">
<translate android:fromXDelta="100%"
android:toXDelta="0%" android:fromYDelta="0%"
android:toYDelta="0%" android:duration="200">
</translate>
</set>
滑出\u右
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<translate android:fromXDelta="0%" android:toXDelta="100%"
android:fromYDelta="0%" android:toYDelta="0%"
android:duration="200">
</translate>
</set>
向左滑动\u
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="true">
<translate android:fromXDelta="-100%"
android:toXDelta="0%" android:fromYDelta="0%"
android:toYDelta="0%" android:duration="200">
</translate>
</set>
滑出\u左
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="true">
<translate android:fromXDelta="0%"
android:toXDelta="-100%" android:fromYDelta="0%"
android:toYDelta="0%" android:duration="200">
</translate>
</set>
这就是你如何调用这个函数:
openFragment(activity, new MyFragment());
我编写了一个在两个片段之间切换的虚拟活动。从FragmentA到FragmentB时,FragmentA被添加到后面的堆栈中。但是,当我返回到FragmentA时(按下back),创建了一个全新的FragmentA,并且丢失了它所处的状态。我感觉我在寻找与这个问题相同的东西,但我包含了一个完整的代码示例来帮助解决这个问题: 然而,如果在删除片段时调用addToBackStack(),则该片段将被停
我想在这个导航用例中避免这种情况:A- 其中所有片段实例都保存在后栈中。原因:避免内存溢出错误。 我尝试创建一个自己的导航工作流,如下所述:https://stackoverflow.com/questions/18041583/fragments-backstack-issue?noredirect=1#comment26393904_18041583(它应该模仿活动行为,在开始一个新操作后调用
我正在进行一项活动,其中有TabLayout和两个表示选项卡内容的片段。我在活动的OnCreate方法中手动管理打开选项卡的当前状态: 这只是一个简单的例子。我真正的代码是用C语言编写的,并且有一些其他逻辑来存储和管理活动重启之间的状态。 配置更改时的问题(例如开关方向): 打开的碎片被摧毁 活动被破坏 活动重启 在onCreate方法中,当调用super.onCreate(savedInstan
和我的框架XML 有什么想法吗?我试图将progressBar放在WebView的“前面”,但是当页面被加载时,图标并没有消失...
我正在开发一个以活动和片段为结构的简单应用程序,其中一个要求是使其可访问,因此我完成了所有内容描述、导航、焦点等。 它工作得很好,除了片段,如果有一个活动加载一个片段,对讲读取它的内容,然后用户点击一些东西,一个细节片段可以被添加到堆栈的顶部。 如果用户继续导航对讲,仍然记得丢失片段的每个元素的位置。 有没有办法清除事件的辅助功能列表并强制它再次获取它?可访问性管理器似乎没有任何方法。 - 编辑
我有一个maven项目,带有插件的pluginManagement配置。我有一个单独的maven项目,不依赖于插件。Project不是Project的父项目。我有第三个项目,其父项目是使用插件P的 当我试图从项目上的plugin运行目标时,maven也尝试执行该目标项目,但失败了。 [错误]在当前项目和插件组[org.apache.maven.plugins,org.codehaus.mojo]中