Moh*_*sin 7 stack android android-fragments android-fragmentactivity fragmentmanager
我需要一些帮助.以这种方式将片段添加到活动中.问题是每次调用openFragment时都会创建片段并添加.这很明显.问题:我做了什么修改,所以它只能添加片段一次.在具有相同片段标签的下一次调用中,它将无效.
case:第一次按下按钮添加片段并显示.我再次按下相同的按钮它没有任何反应.
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();
}
Run Code Online (Sandbox Code Playgroud)
这是解决方案,它只允许您在堆栈中添加一次片段,否则它将从堆栈中弹出相同的片段.
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();
}
}
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
slide_out_right
<?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>
Run Code Online (Sandbox Code Playgroud)
slide_in_left
<?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>
Run Code Online (Sandbox Code Playgroud)
slide_out_left
<?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>
Run Code Online (Sandbox Code Playgroud)
这就是你如何调用这个函数:
openFragment(activity, new MyFragment());
Run Code Online (Sandbox Code Playgroud)
使用FragmentTransaction.replace()而不是FragmentTransaction.add():
这与调用
remove(Fragment)所有当前添加的片段基本相同,这些片段使用相同的参数添加,containerViewId然后add(int, Fragment, String)使用相同的参数.
第一次调用FragmentTransaction.replace()将只添加片段,因为没有要删除的片段.
小智 5
使用以下方法检查片段是否已添加:
if(!Fragment.isAdded()){
//add fragment
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12829 次 |
| 最近记录: |