2016-09-25 190 views
3

应用程序有一个主要活动和两个片段。主要活动主机MainFragmentMainFragment包含提交BreedingFragment(运行)的按钮。只有当方向没有改变时,应用程序才能正常工作,但当BreedingFragment打开并且方向改变时会崩溃。Android应用程序崩溃,方向更改

在调查stackoverflow几个小时后,我发现了以下文章,并按照答案,但它没有调试的问题。

  1. Android Application Crashes With Orientation Changes
  2. Orientation change Crash Application
  3. Rotation of screen crashes android app
  4. My Android application crashes when I change screen orientation

的答案主要是建议使用在AndroidManifest.xml下面的代码:

android:configChanges="orientation|keyboardHidden|screenSize" 

最后一个线程建议以下考虑:

的活动实际上停止并重新启动每次设备 方向变化。您需要编写自己的主题, 即停止线程并在设备更改 方向时重新启动线程,可能会将状态保存在两者之间。

MainActivity:

public class MainActivity extends FragmentActivity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 
} 

MainFragment:

public class MainFragment extends Fragment { 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     View v = inflater.inflate(R.layout.fragment_main, container, false); 

     Button breedButton = (Button) v.findViewById(R.id.pokemon_breeding_button); 

     breedButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       final FragmentManager fragmentManager = getActivity().getSupportFragmentManager(); 
       final FragmentTransaction transaction = fragmentManager.beginTransaction(); 
       transaction.replace(R.id.fragment, new BreedingFragment()); 
       transaction.addToBackStack(null); 
       transaction.commit(); 
      } 
     }); 
     return v; 
    } 
} 

BreedingFragment:

public class BreedingFragment extends Fragment { 

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

     return inflater.inflate(R.layout.fragment_breeding, container, false); 
    } 
} 

登录猫:

E/AndroidRuntime: FATAL EXCEPTION: main 
        Process: com.revittechnology.zapdos, PID: 12795 
        java.lang.RuntimeException: Unable to start activity ComponentInfo{com.revittechnology.zapdos/com.revittechnology.zapdos.MainActivity}: android.view.InflateException: Binary XML file line #24: Error inflating class fragment 
         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2429) 
         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2493) 
         at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4014) 
         at android.app.ActivityThread.access$900(ActivityThread.java:166) 
         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1289) 
         at android.os.Handler.dispatchMessage(Handler.java:102) 
         at android.os.Looper.loop(Looper.java:136) 
         at android.app.ActivityThread.main(ActivityThread.java:5590) 
         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:1280) 
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1096) 
         at dalvik.system.NativeStart.main(Native Method) 
        Caused by: android.view.InflateException: Binary XML file line #24: Error inflating class fragment 
         at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:720) 
         at android.view.LayoutInflater.rInflate(LayoutInflater.java:762) 
         at android.view.LayoutInflater.rInflate(LayoutInflater.java:771) 
         at android.view.LayoutInflater.rInflate(LayoutInflater.java:771) 
         at android.view.LayoutInflater.inflate(LayoutInflater.java:499) 
         at android.view.LayoutInflater.inflate(LayoutInflater.java:398) 
         at android.view.LayoutInflater.inflate(LayoutInflater.java:354) 
         at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:331) 
         at android.app.Activity.setContentView(Activity.java:2018) 
         at com.revittechnology.zapdos.MainActivity.onCreate(MainActivity.java:13) 
         at android.app.Activity.performCreate(Activity.java:5447) 
         at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094) 
         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2393) 
         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2493)  
         at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4014)  
         at android.app.ActivityThread.access$900(ActivityThread.java:166)  
         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1289)  
         at android.os.Handler.dispatchMessage(Handler.java:102)  
         at android.os.Looper.loop(Looper.java:136)  
         at android.app.ActivityThread.main(ActivityThread.java:5590)  
         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:1280)  
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1096)  
         at dalvik.system.NativeStart.main(Native Method)  
        Caused by: java.lang.IllegalStateException: Fragment com.revittechnology.zapdos.MainFragment did not create a view. 
         at android.support.v4.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2319) 
         at android.support.v4.app.FragmentController.onCreateView(FragmentController.java:120) 
         at android.support.v4.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:356) 
         at android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(BaseFragmentActivityHoneycomb.java:31) 
         at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:79) 
         at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:696) 
         at android.view.LayoutInflater.rInflate(LayoutInflater.java:762)  
         at android.view.LayoutInflater.rInflate(LayoutInflater.java:771)  
         at android.view.LayoutInflater.rInflate(LayoutInflater.java:771)  
         at android.view.LayoutInflater.inflate(LayoutInflater.java:499)  
         at android.view.LayoutInflater.inflate(LayoutInflater.java:398)  
         at android.view.LayoutInflater.inflate(LayoutInflater.java:354)  
         at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:331)  
         at android.app.Activity.setContentView(Activity.java:2018)  
         at com.revittechnology.zapdos.MainActivity.onCreate(MainActivity.java:13)  
         at android.app.Activity.performCreate(Activity.java:5447)  
         at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)  
         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2393)  
         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2493)  
         at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4014)  
         at android.app.ActivityThread.access$900(ActivityThread.java:166)  
         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1289)  
         at android.os.Handler.dispatchMessage(Handler.java:102)  
         at android.os.Looper.loop(Looper.java:136)  
         at android.app.ActivityThread.main(ActivityThread.java:5590)  
         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:1280)  
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1096)  
         at dalvik.system.NativeStart.main(Native Method)  
I/Process: Sending signal. PID: 12795 SIG: 9 
Application terminated. 
+0

堆栈溢出用于编程问题。你的问题是什么?如果您的问题是“我为什么会崩溃?”,请使用LogCat检查与您的崩溃相关的Java堆栈跟踪:https://stackoverflow.com/questions/23353173/uncomfort-myapp-has-stopped-how-can-i -solve-this – CommonsWare

+0

是的,如果你的问题是关于你正在观察的崩溃的原因,那么请在这里发布crashtracetrace。 – Tobias

+1

你不应该让你的碎片取代自己 –

回答

0
Main Activity and Main Fragment.

上述相片阐述的情况。 MainActivity.java主机MainFragment.java和主片段有一个启动另一个片段的按钮。

我的要求是什么?

  1. 主要活动刚刚举办的主要碎片,并没有 别的。
  2. 主片段有按钮来启动第二个片段。
  3. 按下返回按钮时关闭(结束/完成)第二个片段 (返回主活动)。
  4. 适用于设备(​​屏幕)旋转。

第一步是创建主要活动。有几件事情需要考虑在主要活动:

  1. 扩展MainActivityFragmentActivity

public class MainActivity extends FragmentActivity如下:

  • 检查savedInstanceState,如果然后运行 MainFragment。我们这样做的原因是为了避免再次运行 并再次使用设备旋转的MainFragment。
  • 这里是MainActivity.java代码:

    public class MainActivity extends FragmentActivity { 
    
        @Override 
        protected void onCreate(Bundle savedInstanceState) { 
         super.onCreate(savedInstanceState); 
         setContentView(R.layout.activity_main); 
    
         if (savedInstanceState == null) { 
          FragmentManager fManager = getSupportFragmentManager(); 
          FragmentTransaction fTransaction = fManager.beginTransaction(); 
          fTransaction.add(R.id.fragment, new MainFragment()); 
          fTransaction.commit(); 
         } 
    
        } 
    } 
    

    确保有代码以下行activity_main.xml

    <FrameLayout 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" 
        android:name="com.revittechnology.zapdos.MainFragment" 
        android:id="@+id/fragment" /> 
    

    现在创建MainFragment.java

    public class MainFragment extends Fragment { 
        @Override 
        public View onCreateView(LayoutInflater inflater, ViewGroup container, 
              Bundle savedInstanceState) { 
         View v = inflater.inflate(R.layout.fragment_main, container, false); 
         // Inflate the layout for this fragment 
         Button breedButton = (Button) v.findViewById(R.id.pokemon_breeding_button); 
    
         breedButton.setOnClickListener(new View.OnClickListener() { 
          @Override 
          public void onClick(View v) { 
           final FragmentManager fragmentManager = getActivity().getSupportFragmentManager(); 
           final FragmentTransaction transaction = fragmentManager.beginTransaction(); 
           transaction.replace(R.id.fragment, new BreedingFragment()); 
           transaction.addToBackStack("tag"); 
           transaction.commit(); 
          } 
         }); 
         return v; 
        } 
    } 
    

    返回视图(return v),因为它是不可能找到按钮和布局的其它元件,如果视图是不存在的之前包含所有的代码。 transaction.addToBackStack("tag");有助于将片段添加到后备堆栈中,并启用返回以通过后退关闭片段。声明课前导入上面的类所需要的库:

    现在创建第二个片段BreedingFragment.java`

    public class BreedingFragment extends Fragment { 
        public View onCreateView(LayoutInflater inflater, ViewGroup container, 
              Bundle savedInstanceState) { 
         // Inflate the layout for this fragment 
         return inflater.inflate(R.layout.fragment_breeding, container, false); 
        } 
    } 
    

    注。

    结论:该应用程序与设备方向崩溃,因为第二个片段与按一下按钮启动,MainFragment是由MainActivity主机。随着设备方向,片段被关闭,并且MainActivity.java中没有代码再次启动片段,因此它给出了空的特殊错误。将片段相关代码添加到MainActivity.java中后,以编程方式启动片段解决问题。