【问题标题】:Fragment crashing when rotate screen or minimise theapplication旋转屏幕或最小化应用程序时碎片崩溃
【发布时间】:2023-03-03 20:38:01
【问题描述】:

我将从第一个片段转到第二个片段。当我在第二个片段上旋转或最小化屏幕时,应用程序崩溃。早些时候,当我用来最小化应用程序的第一个片段被调用时(不知道为什么),现在它的崩溃是代码:

2nd Fragment :
public class SubPlaceFragment extends Fragment {

    public static final String LOG_TAG = SubPlaceFragment.class.getSimpleName();

    private OnFragmentInteractionListener mListener;

    public SubPlaceFragment() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_sub_place, container, false);
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);

    }

    @Override
    public void onDetach() {
        super.onDetach();
        mListener = null;
    }

    @Override
    public void onPause() {
        super.onPause();
        Log.i(LOG_TAG,"onPause");
    }

    @Override
    public void onResume() {
        super.onResume();
        Log.i(LOG_TAG, "onResume");
    }

    @Override
    public void onStop() {
        super.onStop();
        Log.i(LOG_TAG, "onStop");
    }

    @Override
    public void onStart() {
        super.onStart();
        Log.i(LOG_TAG, "onStart");
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        Log.i(LOG_TAG, "onActivityCreated");
    }

    public interface OnFragmentInteractionListener {
        // TODO: Update argument type and name
        void onFragmentInteraction(Uri uri);
    }
}

这是我的日志:

E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                Process: com.example.manish.planetdelhi, PID: 16516
                                                                                java.lang.RuntimeException: Unable to resume activity {com.example.manish.planetdelhi/com.example.manish.planetdelhi.MainActivity}: java.lang.ClassCastException: com.example.manish.planetdelhi.SubPlaceFragment cannot be cast to com.example.manish.planetdelhi.PlaceListFragment
                                                                                    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2812)
                                                                                    at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2845)
                                                                                    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1252)
                                                                                    at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                    at android.os.Looper.loop(Looper.java:136)
                                                                                    at android.app.ActivityThread.main(ActivityThread.java:5086)
                                                                                    at java.lang.reflect.Method.invokeNative(Native Method)
                                                                                    at java.lang.reflect.Method.invoke(Method.java:515)
                                                                                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
                                                                                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
                                                                                    at dalvik.system.NativeStart.main(Native Method)
                                                                                 Caused by: java.lang.ClassCastException: com.example.manish.planetdelhi.SubPlaceFragment cannot be cast to com.example.manish.planetdelhi.PlaceListFragment
                                                                                    at com.example.manish.planetdelhi.MainActivity.AddPlaceFragment(MainActivity.java:74)
                                                                                    at com.example.manish.planetdelhi.MainActivity.onStart(MainActivity.java:80)
                                                                                    at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1194)
                                                                                    at android.app.Activity.performStart(Activity.java:5258)
                                                                                    at android.app.Activity.performRestart(Activity.java:5314)
                                                                                    at android.app.Activity.performResume(Activity.java:5319)
                                                                                    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2797)
                                                                                    at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2845) 
                                                                                    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1252) 
                                                                                    at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                                    at android.os.Looper.loop(Looper.java:136) 
                                                                                    at android.app.ActivityThread.main(ActivityThread.java:5086) 
                                                                                    at java.lang.reflect.Method.invokeNative(Native Method) 
                                                                                    at java.lang.reflect.Method.invoke(Method.java:515) 
                                                                                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
                                                                                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
                                                                                    at dalvik.system.NativeStart.main(Native Method) 

这是我完整的主要活动代码:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
        AddPlaceFragment(savedInstanceState);
    }

    @Override
    protected void onPause() {
        super.onPause();
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
    }

    private void AddPlaceFragment(Bundle loadingFirstTime)
    {
        // calling placeListFragment for the first time
        if (loadingFirstTime == null) {
            FragmentManager fragmentManager = getFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            fragmentTransaction.add(R.id.fragment_container, placeListFragment).addToBackStack(placeListFragment.getTag());
            fragmentTransaction.commit();
        }
    }

    // calling placeListFragment when screen is rotated
    private void AddPlaceFragment()
    {
        placeListFragment = (PlaceListFragment) getFragmentManager().findFragmentById(R.id.fragment_container);
    }

    @Override
    protected void onStart() {
        super.onStart();
       AddPlaceFragment();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onBackPressed() {
        int fragmentCount = getFragmentManager().getBackStackEntryCount();
        if(fragmentCount > 1)
        {
        getFragmentManager().popBackStack();
        }
        else {
            finish();
        }
    }

    @Override
    public void DelhiPlaceClicked(int paramInt, String paramString) // meathod invoked from placelistfragment
    {
        Bundle localBundle = new Bundle();
        localBundle.putInt("_id", paramInt);
        localBundle.putString("sub_place_name", paramString);
        SubPlaceFragment subfragment = new SubPlaceFragment();
        subfragment.setArguments(localBundle);
        FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.fragment_container, subfragment).addToBackStack(subfragment.getTag());
        fragmentTransaction.commit();
    }

感谢您的帮助:)

【问题讨论】:

  • 你能分享你的主要活动代码吗?或者至少是第 80 和 74 行?
  • 就 ClassCastException 而言,这意味着您正在声明某种类型的变量并将其分配给您在布局 xml 文件中定义的另一种类型...
  • @mr_tkp 添加了完整的主要活动代码
  • @ManishGupta 在fragmentTransaction.replace(R.id.fragment_container, subfragment).addToBackStack(subfragment.getTag()); 你没有设置标签。是故意的吗?如果没有,请添加fragmentTransaction.replace(R.id.fragment_container, subfragment, "SubplaceFragment").addToBackStack(subfragment.getTag());之类的标签,如果错误存在,请告诉我们。
  • "MainActivity.java:74" 这意味着错误发生在MainActivity.java的第74行。这是什么?

标签: android android-fragments android-lifecycle fragment-lifecycle


【解决方案1】:

您正在通过以下方式添加您的subfragment

fragmentTransaction.replace(R.id.fragment_container, subfragment)

现在,调用:

getFragmentManager().findFragmentById(R.id.fragment_container);

只会返回您的subfragment。因此,你得到了 classcast 异常

【讨论】:

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