2016-09-25 170 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中後,以編程方式啓動片段解決問題。