【问题标题】:Activity getting Destroyed when calling Fragment调用 Fragment 时活动被销毁
【发布时间】:2019-01-25 07:25:15
【问题描述】:

在 Class 的子类中使用 Fragment RoboActivity, Fragment 时应用程序崩溃 交易开始;

我也无法使用底部导航或 Tablayout,也许它与roboguice有关。

这是 Obd 汽车扫描应用程序

代码如下:

  public void onCreate(Bundle savedInstanceState) 

{
            super.onCreate(savedInstanceState);

            SpeedButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Fragment selectedFragment = null;
                    selectedFragment = new SpeedFragment();
                    AppCompatActivity activity=new AppCompatActivity();

                    if (!isFinishing() && !isDestroyed()) {
                        FragmentTransaction ft =activity.getSupportFragmentManager()
                                .beginTransaction();
                        ft.replace(R.id.fragment_container, selectedFragment);
                        ft.commit();
                    }
                }
            });
      }

日志:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.quad14.obdnewtry, PID: 7878
    java.lang.IllegalStateException: Activity has been destroyed
        at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:2114)
        at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:683)
        at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:637)
        at com.quad14.obdnewtry.activity.MainActivity$3.onClick(MainActivity.java:272)
        at android.view.View.performClick(View.java:5637)
        at android.view.View$PerformClick.run(View.java:22429)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6119)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

布局:下面只添加Fragment相关的组件

 <FrameLayout
            android:id="@+id/fragment_container"
            android:layout_width="match_parent"
            android:layout_height="80dp"
            />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/buttonlinear"
            android:orientation="horizontal">
            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Speed"
                android:id="@+id/speedbtid"/>

            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Rpm"
                android:id="@+id/rpmbtid"/>
            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Total Km"
                android:id="@+id/distanbtid"/>

        </LinearLayout>

    </LinearLayout>

【问题讨论】:

  • 您使用的是哪种类型的活动? Activity 还是 AppCompactActivity?哪个片段? android.support.v4.app.Fragment 还是 android.app.Fragment?
  • MainActivity 扩展 RoboActivity 和 Roboactivity 扩展 Activity。我正在使用 android.support.v4.app.Fragment
  • 要么从 AppCompactActivity 扩展 Roboactivity,要么将 android.support.v4.app.Fragment 更改为 android.app.Fragment

标签: android android-activity fragmentmanager


【解决方案1】:

如果你的 Activity 扩展了 Activity,你的 Fragment 应该是 android.app.Fragment。然后使用下面的代码

 android.app.FragmentTransaction ft =getFragmentManager()
                            .beginTransaction();
                    ft.replace(R.id.fragment_container, selectedFragment);
                    ft.commit();

否则,如果您的活动扩展 AppCompactActivity,您的片段应该是 android.support.v4.app.Fragment。那么此代码将起作用

 FragmentTransaction ft =getSupportFragmentManager()
                            .beginTransaction();
                    ft.replace(R.id.fragment_container, selectedFragment);
                    ft.commit();

【讨论】:

  • 我找不到 beginTransaction();在 android.app.fragment 类中。那么我怎么能像你在第一个区块的帖子中提到的那样进行片段交易
  • 导入 android.app.FragmentTransaction 并立即尝试
  • @Learnerfrombeginning,首先你不能自己创建一个新的AppCompatActivity实例。只有 ActivityManager 负责创建 Activity 的新实例。尝试 Athira 建议的解决方案。我认为它会解决你的问题。 :)
  • 感谢大家的支持,我找到了解决方案: // AppCompatActivity activity=new AppCompatActivity();尝试使用 RoboActivity activity=MainActivity.this; ,,,,通过这样做我可以获得片段交易
  • 您不需要创建活动对象。您可以直接从活动中调用 getFragmentManager()
【解决方案2】:

尝试使用

getContext().getSupportFragmentManager().beginTransaction();

【讨论】:

  • 我必须使用 AppCompatActivity 的对象,所以如果我像你说的那样进行修改,那么 getSupportFragmentManger 将无法解析
【解决方案3】:

而不是像AppCompatActivity activity=new AppCompatActivity(); 这样为活动创建对象并使用它来获取片段管理器。

您可以从活动上下文中获取片段管理器,例如 YourActivityname.this.getFragmentManager();

【讨论】:

  • 如果我按照你的方式做,那么 getsupportFragmentManager 无法解决,因为:如果我更改超类,我的类不会扩展需要类,然后发生其他问题,公共类 MainActivity 扩展 RoboActivity {}
  • 让你的机器人活动扩展 appcompat 活动
  • roboactivity 是库 'org.roboguice:roboguice:3.0.1' 的类,所以我无法对其进行更改。顺便说一句,Roboactivity 扩展了 Activity
猜你喜欢
  • 1970-01-01
  • 2014-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多