标签: fragmenttransaction

用同一类的另一个片段替换片段

我有一个fragment(让我们称之为MyFragment)根据参数中传递的参数膨胀不同的布局.
如果MyFragment是从不同的片段启动的,那么一切都很好.但是如果MyFragment处于活动状态并且我想要使用不同的布局参数启动新的MyFragment,则fragmentManager根本不会创建新的片段.

data.setInt("Layout index",i);
fragmentTab0 = (Fragment) new MyFragment();
fragmentTab0.setArguments(data);
fragmentTransaction.replace(R.id.fragmentContent, fragmentTab0, "MY");
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
Run Code Online (Sandbox Code Playgroud)

我如何强制说服fragmentTransaction再次启动片段?

注意:这里重点是我需要再次充气布局,这与之前充气的布局不同.代码如下:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    switch( getArguments().getInt("Layout index") ) {
    case 1:
        rootView = inflater.inflate(R.layout.firstlayout, container, false);
        break;
    case 2:
        rootView = inflater.inflate(R.layout.secondlayout, container, false);
        break;
    case 3:
        rootView = inflater.inflate(R.layout.thirdlayout, container, false);
        break;
    default: break;
    }       
Run Code Online (Sandbox Code Playgroud)

android android-fragments fragmenttransaction

7
推荐指数
1
解决办法
9690
查看次数

使用addToBackStack进行Fragment事务后单击后退按钮不会执行任何操作

我希望能够replace FragmentTransaction通过使用来反转a addToBackStack():

FragmentTransaction fragmentTransaction = getActivity().getSupportFragmentManager().beginTransaction();         
Fragment scheduleFragment = new ScheduleFragment();     
fragmentTransaction.replace(R.id.content_container, scheduleFragment, "scheduleFragment");
fragmentTransaction.addToBackStack("scheduleFragment");
fragmentTransaction.commit();
Run Code Online (Sandbox Code Playgroud)

但在此之后,单击后退按钮不会执行任何操作.

从文档和它应该扭转交易.

我错过了什么?

android android-fragments fragmenttransaction

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

如何在按钮上添加/删除片段?

目前我有一个"RELATIVE_LAYOUT"容器,我用它来添加我的片段.我在按钮上使用OnClickListener将片段XML布局加载到RelativeLayout容器中.

我想要实现的是,当我按下按钮一次时,片段应该加载......当我再次按下它时,应该删除片段.我已经尝试使用整数来识别是否加载了片段,但是失败了.任何帮助赞赏......

码:

public class MainActivity extends Activity {
    Button B1,B2;
    int boolb1=0, boolb2=0;

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

        B1 = (Button)findViewById(R.id.btn1);
        B2 = (Button)findViewById(R.id.btn2);

        B1.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                FragmentManager fm = getFragmentManager();
                FragmentTransaction ft = fm.beginTransaction();
                FragmentOne f1 = new FragmentOne();

                if(boolb1==0)
                {ft.add(R.id.frg1, f1);
                ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                boolb1=1;}
                else
                {ft.remove(f1);
                ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
                boolb1=0;}
                //ft.addToBackStack("f1");
                ft.commit();
            }
        });

        B2.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                FragmentManager fm = getFragmentManager();
                FragmentTransaction ft = fm.beginTransaction(); …
Run Code Online (Sandbox Code Playgroud)

java android android-fragments fragmenttransaction fragmentmanager

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

Android Fragment未添加到Back Stack

我正在做一个基于NavigationDrawer的应用程序.我有一个如下所示的层次结构

NavigationDrawer - > RootFragment(未添加到后面的堆栈) - >详细信息片段(添加到后台堆栈)

现在,我试图通过按后退按钮尝试退出应用程序时向用户显示一条消息.这是我正在使用的代码.

@Override
    public void onBackPressed() {
        if (getFragmentManager().getBackStackEntryCount() > 0) {
            getFragmentManager().popBackStack();
        }
        else if (getFragmentManager().getBackStackEntryCount() == 0) {
            new AlertDialog.Builder(this)
                    .setMessage("Are you sure you want to exit?")
                    .setCancelable(false)
                    .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            MainActivity.this.finish();
                        }
                    })
                    .setNegativeButton("No", null)
                    .show();

        }
        else
        {
            super.onBackPressed();
        }
    }
Run Code Online (Sandbox Code Playgroud)

当我从详细信息片段中单击后退按钮(添加到后台堆栈)时,我收到警报消息.相反,我会回到根片段.

但是,如果我像这样更新代码,按后退按钮会将用户带回到根视图.所以它看起来像getFragmentManager().getBackStackEntryCount()即使将详细片段添加到后台堆栈也是零.

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

以下是我从rootFragment调用详细信息片段的方法.

FragmentManager …
Run Code Online (Sandbox Code Playgroud)

android android-fragments fragmenttransaction fragment-backstack

7
推荐指数
1
解决办法
1552
查看次数

当通过导航抽屉将先前的片段替换为新片段时,volley显示新片段中的先前片段响应

我在导航图中总共有12个片段..每个片段都有一个凌空方法.每个片段显示自己的凌空响应,除了position = 1和position = 5片段.

当我的应用程序启动

情形1: 我打开位置1片段,并且在打开位置5片段后,两个片段都具有位置1片段响应.

场景2:如果我打开位置5片段并且在打开位置1片段之后比两个片段都具有位置1片段响应.

场景1图像:

FragmentInbox FragmentLaws

场景2图像:

FragmentLaws FragmentInbox

我的片段事务方法类:

private void showFragment(Fragment fragment) {
    llContainer = (LinearLayout)findViewById(R.id.container);
    if (fragment != null) {
        llContainer.removeAllViewsInLayout();
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.container, fragment, fragment.getClass().getName());
        fragmentTransaction.commit();
        fragmentManager.popBackStack();
    }
}


@Override
public void onItemSelected(int position) {
    Fragment frag = null;
    switch (position) {
        case POS_HOME:
            frag = FragmentHome.instance(screenTitles[position]);
            break;
        case POS_INBOX:
            txtToolbarTitle.setVisibility(View.VISIBLE);
            txtToolbarTitle.setText("Notifications");
            frag = FragmentInbox.instance(screenTitles[position]);
            break;
        case POS_LOG:
            frag = FragmentLog.instance(screenTitles[position]);;
            break;
        case POS_BOOK:
            frag = FragmentBook.instance(screenTitles[position]); …
Run Code Online (Sandbox Code Playgroud)

android android-fragments fragmenttransaction android-volley

7
推荐指数
1
解决办法
200
查看次数

FragmentTransacation具有> 4性能的幻灯片进/出动画

我正在尝试使用幻灯片进/出动画实现片段事务.我正在开发至少14 sdk所以ObjectAnimator对我来说是唯一的选择(还有其他方法吗?根据我的理解,翻译动画不可用).

守则很简单:

AnimationView.java - 包装类

public class AnimationView extends LinearLayout {

public AnimationView(Context context, AttributeSet attrs) {
    super(context, attrs);
}


public float getYFraction() {
    return getHeight();
}

public void setYFraction(float yFraction) {
    final int height = this.getHeight();
    setY((height > 0) ? (yFraction * height) : -9999);
}
}
Run Code Online (Sandbox Code Playgroud)

滑入和滑出xml

<?xml version="1.0" encoding="utf-8"?>
<set>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
                android:interpolator="@android:anim/accelerate_decelerate_interpolator"
                android:propertyName="yFraction"
                android:valueType="floatType"
                android:valueFrom="-1"
                android:valueTo="0"
                android:duration="600"/>
Run Code Online (Sandbox Code Playgroud)

<?xml version="1.0" encoding="utf-8"?>
<set>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
                android:interpolator="@android:anim/accelerate_decelerate_interpolator"
                android:propertyName="yFraction"
                android:valueType="floatType"
                android:valueFrom="0"
                android:valueTo="1"
                android:duration="600"/>
Run Code Online (Sandbox Code Playgroud)

动画效果很好,你可以看到我使用了自定义属性yFraction.但性能非常糟糕......在某些平板电脑中,我注意到动画期间有一条水平的白线(大约3像素高),在其他智能手机设备中,它只是变慢(不是持续时间慢而是闪烁).

如果我将valueFrom&valueTo设置为适合视图维度,我找到了修复它的方法,但它不是通用的,并且需要0到1才能对所有视图都通用 …

android android-animation android-fragments objectanimator fragmenttransaction

6
推荐指数
1
解决办法
3870
查看次数

Android:Dialog Fragment和Backstack问题

所以我要说我有以下片段:

Fragment1 Fragment2 DialogFragment Fragment3 Fragment4

让我们说我转到下面的片段,每个fragmetn被添加到后栈:

Fragment1 -> Fragment2 -> DialogFragment -> Fragment3 -> Fragment4
Run Code Online (Sandbox Code Playgroud)

如果我单击BACK按钮,这通常应该转到Fragment3,而是显示DialogFragment.

以下是我使用的片段交易:

Fragment1 - > Fragment2

FragmentTransaction ft = mActivity.getSupportFragmentManager().beginTransaction();
ft.replace(R.id.mainContentHolder, new Fragment2(), "Fragment2");
ft.addToBackStack(null);
ft.commit();
Run Code Online (Sandbox Code Playgroud)

Fragment2 - > DialogFragment

FragmentTransaction ft2 = getFragmentManager().beginTransaction();
ft2.setCustomAnimations(R.anim.flipp_in,R.anim.flipp_static);
ft2.add(R.id.mainContentHolder, new DialogFragment(), "DialogFragment");
ft2.addToBackStack(null);   
ft2.commit();
ft2.hide(Fragment1.this);
Run Code Online (Sandbox Code Playgroud)

DialogFragment - > Fragment3

FragmentTransaction ft = getFragmentManager().beginTransaction(); 
ft.replace(R.id.mainContentHolder, new Fragment3(), "Fragment3");
ft.addToBackStack(null);
ft.commit();
Run Code Online (Sandbox Code Playgroud)

Fragment3 - > Fragment4

FragmentTransaction ft = getFragmentManager().beginTransaction();                                           
ft.replace(R.id.mainContentHolder, new Fragment4(), "Fragment4");
ft.addToBackStack(null);                        
ft.commit(); …
Run Code Online (Sandbox Code Playgroud)

android android-fragments back-stack fragmenttransaction

6
推荐指数
1
解决办法
1765
查看次数

Android Lint说我可以用<merge>标签替换布局,但是我需要在片段事务中使用布局的id

我在Android中有一个标签式界面,并在我的应用程序中使用FrameLayout作为我的主要布局.我收到一条Android Lint警告说:

This <FrameLayout> can be replaced with a <merge\> tag
Run Code Online (Sandbox Code Playgroud)

我使用此FrameLayout(名为fragmentContainer)的唯一位置是onTabSelected侦听器.这是一个简化版本.

@Override
public void onTabSelected(ActionBar.Tab tab,
        FragmentTransaction fragmentTransaction) {
    // When the given tab is selected, show the tab contents in the
    // container
    Fragment fragment;
    String tag;
    switch (tab.getPosition()) {

    case 0:
        fragment = new myFragment1();
        tag = "myFragment1";
        break;

    case 1:
        fragment = new new myFragment2();
        tag = "myFragment2";
        break;

    default:
        Log.d(TAG, "invalid tab selected: " + tab.getPosition());
        break;
    }
    fragmentTransaction.replace(R.id.fragmentContainer, fragment, tag);
}
Run Code Online (Sandbox Code Playgroud)

这很好用,但我希望尽可能提高性能,并尽可能摆脱任何Lint警告.如果我用合并标记替换FrameLayout,我不能调用fragmentTransaction(),因为id在任何地方都不存在.

这是FrameLayout的完整性:

<FrameLayout …
Run Code Online (Sandbox Code Playgroud)

android android-fragments android-lint fragmenttransaction

6
推荐指数
1
解决办法
986
查看次数

动画时如何在退出片段上方显示输入片段.

我想要实现的效果是将输入(新)片段覆盖在退出(旧)片段之上,但是当我用新片段替换旧片段时,旧片段就会消失,新片段向上滑动容器,这是可见的(容器).

我不想为旧片段设置动画,只是保持旧片段不变,并且当它可见时滑动它上面的新片段.

以下是我的代码:

// First time adding fragment i.e. "oldFragemnt"
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame, oldFragment, "oldFragemnt");
ft.addToBackStack(null);
ft.commit();

// while adding "newFragemnt"
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.new_slide_in_up,0,0,R.anim.new_slide_out_down);                                   
ft.replace(R.id.content_frame, newFragment, "newFragemnt");
ft.addToBackStack(null);
ft.commit();
Run Code Online (Sandbox Code Playgroud)

指导我出错的地方.当新片段向上滑动时,我的旧片段正在消失.

android android-animation android-fragments fragmenttransaction

6
推荐指数
1
解决办法
1626
查看次数

片段在API-21上的交易替代是落后的

我正在开发一个使用片段的应用程序,上周我的测试设备进行了lolipop更新.当我在lolipop设备上测试我的应用程序时,我看到Fragment Transaction的替换方法无法正常工作.

虽然在Kitkat版本上一切都很好,但它在Lolipop版本中令人困惑.

为了解释我的情况,我添加了一些图片.

--First Screen ---------------------------- KitKat ----------------- - - - - - - - - - - 棒糖 - - - - - - -

在此输入图像描述 在此输入图像描述 在此输入图像描述

正如你所看到的,当我使用时kitkat,一切都很好,但是一旦我使用lolipop片段事务替换就会令人困惑.

这是我的按钮代码;

mButtonOk.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                FeedbackFragment mFragmentFeedBack = new FeedbackFragment();
                android.app.FragmentManager fm = getFragmentManager();
                fm.executePendingTransactions();
                android.app.FragmentTransaction fragmentTransaction = fm.beginTransaction();
                if (mFragmentFeedBack.isVisible()) {
                    fragmentTransaction.hide(mFragmentFeedBack);
                } else {

                    if (!mFragmentFeedBack.isAdded()) {
                        fragmentTransaction.replace(R.id.containerfragment, mFragmentFeedBack);
                    }


                    fragmentTransaction.show(mFragmentFeedBack);
                }
                fragmentTransaction.addToBackStack(null);
                fragmentTransaction.commit();

            }
        });
Run Code Online (Sandbox Code Playgroud)

这是我的xml;

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" …
Run Code Online (Sandbox Code Playgroud)

android android-fragments fragmenttransaction

5
推荐指数
1
解决办法
743
查看次数