【问题标题】:I can't find a way of successfully replacing one fragment with another on button click我找不到在按钮单击时成功将一个片段替换为另一个片段的方法
【发布时间】:2021-10-10 20:50:47
【问题描述】:

我检查了一些问题并进行了我认为必要的更改,但每次我按下按钮替换片段时应用程序仍然崩溃。片段具有通常的代码,仅用于简单的布局。在启动时,Activity 将显示我首先添加的片段。

这是我的 MainActivity:

public class MainActivity extends AppCompatActivity {

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


        final FragmentLogin fl = new FragmentLogin();
        final FragmentRegistration fr = new FragmentRegistration();
        final android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();
        final android.support.v4.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.add(R.id.fragcon, fr);
        fragmentTransaction.commit();


        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(fl.isVisible())
                {
                    fl.onActivityCreated(savedInstanceState);
                    fragmentTransaction.replace(R.id.fragcon, fr);

                    fragmentTransaction.commit();
                }
                else  {
                    fl.onActivityCreated(savedInstanceState);
                    fragmentTransaction.replace(R.id.fragcon, fl);
                    fragmentTransaction.commit();
                }
            }
        });
    }
}

这是我的 activitymain.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.aditya.registrationnlogin.MainActivity">


<RelativeLayout
    android:id="@+id/fragcon"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight="1.8"
    android:layout_gravity="center_horizontal">

</RelativeLayout>

<Button
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:text="SWITCH" />

</LinearLayout>

【问题讨论】:

    标签: android android-layout android-fragments


    【解决方案1】:

    你必须为每个新事务调用fragmentManager.beginTransaction();,否则会抛出异常

     if(fl.isVisible())
         {
             //fl.onActivityCreated(savedInstanceState);
             fragmentManager.beginTransaction().replace(R.id.fragcon, fr);
             fragmentTransaction.commit();
         }else{
             //fl.onActivityCreated(savedInstanceState);
             fragmentManager.beginTransaction().replace(R.id.fragcon, fl);
             fragmentTransaction.commit();
         }
    

    并使用setArgument传递bundle而不中断片段生命周期

    【讨论】:

    • 感谢您的回复,但我究竟应该在哪里添加 setArguement() ?
    • 点击我的回答中的链接setArgument 并阅读了解如何操作
    【解决方案2】:
    // use this it will work sure dude !!    
    @Override
    protected void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    final FragmentLogin fl = new FragmentLogin();
    final FragmentRegistration fr = new FragmentRegistration();
    final android.support.v4.app.FragmentManager fragmentManager = 
    getSupportFragmentManager();
    final android.support.v4.app.FragmentTransaction fragmentTransaction = 
    fragmentManager.beginTransaction();
    fragmentTransaction.add(R.id.fragcon, fr);
    fragmentTransaction.commit();
    
    Button button = (Button) findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
        Fragment fragment = null;
        Class fragmentClass = null;
            if(fl.isVisible())
            {
                fragmentClass = FragmentRegistration.class;
            }
            else  {
                fragmentClass = FragmentLogin.class;
            }
    
       try {
            fragment = (Fragment) fragmentClass.newInstance();
         } catch (Exception e) {
            e.printStackTrace();
         }
    
      // Insert the fragment by replacing any existing fragment
        FragmentManager fragmentManager = getSupportFragmentManager();
        String backStateName = fragment.getClass().getName();
        boolean fragmentPopped = fragmentManager.popBackStackImmediate 
      (backStateName, 0);
    
      if (!fragmentPopped && fragmentManager.findFragmentByTag(backStateName) == 
    null){ //fragment not in back stack, create it.
            FragmentTransaction ft = fragmentManager.beginTransaction();
            ft.replace(R.id.flContent, fragment, backStateName);
            ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
            ft.addToBackStack(backStateName);
            ft.commit();
        }
        }
    });
    }
    }
    

    【讨论】:

    • 该代码在从 fr(注册片段)切换到 fl(登录片段)时确实有效,但反之则无效。我尝试更改 if -else 条件,但现在应用程序在第二次按下按钮时崩溃。
    • 当您要再次按下按钮时,它会检查 if(f1.isVisible()) 条件,但您将登录片段替换为注册,因此登录参考现在不可用。因此,使用变量 checkflag 来检查此条件,其中登录片段的值为 0,注册的值为 1,并且这样做 if(checkFlag==0) { fragmentClass = FragmentRegistration.class; } else { fragmentClass = FragmentLogin.class; }
    【解决方案3】:
    if(fl.isVisible())
         { 
             //put your argument like this
             Bundle args = new Bundle();
             args.putString(ARG_PARAM1, param1);
             fr.setArguments(args)
    
             fragmentManager.beginTransaction().replace(R.id.fragcon, fr);
             fragmentTransaction.commit();
         }else{
             //put your argument like this
             Bundle args = new Bundle();
             args.putString(ARG_PARAM1, param1);
             fr1.setArguments(args)
             fragmentManager.beginTransaction().replace(R.id.fragcon, fl);
             fragmentTransaction.commit();
         }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多