2012-08-03 15 views
3

好的,這裏是問題,我有一個片段活動,其中有兩個片段。一個是ListFragment,另一個是片段。所以,我想顯示片段取決於選擇哪個項目。這是問題。如果我以橫向模式或縱向模式啓動這個片段活動,它可以正常工作。無論如何,當我改變其他方向時,它總是崩潰。錯誤是關於充氣機,就像onCreateView,但我看了其他職位,並沒有其他的決議,如onConfigurationChanges,onSaveInstances,從名稱更改類。所有都有相同的錯誤。所以,我希望有人幫助我。我確實有佈局土地和佈局,但仍然不起作用。片段膨脹錯誤當更改方向

這是我的代碼。

activity_pontix(陸地和肖像模式)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#CCFF99" 
    android:orientation="vertical" > 

    <TextView android:id="@+id/Pontix" 
     android:layout_width="match_parent" 
     android:layout_height="50dp" 
     android:gravity="center_horizontal" 
     android:text="@string/pontix" 
     android:background="#ffffff" 
     android:textColor="#000000" 
     android:textSize="40dp" /> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="horizontal" > 

     <fragment 
      android:id="@+id/sideMenu" 
      android:name="com.example.pontix.SideMenu" 
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:layout_weight="3" /> 

     <fragment 
      android:id="@+id/content" 
      android:name="com.example.pontix.ContentPreview" 
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:layout_weight="1" /> 
    </LinearLayout> 

</LinearLayout> 

SideMenu.java

public class SideMenu extends ListFragment 
{ 
    OnMenuSelectedListener setSelected; 

    public interface OnMenuSelectedListener 
    { 
     public void onItemSelected(int position); 
    } 

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

     int layout = R.layout.side_menu_item; 

     setListAdapter(new ArrayAdapter<String>(getActivity(), layout, MenuItem.Items)); 
    } 

    @Override 
    public void onStart() 
    { 
     super.onStart(); 

     if (getFragmentManager().findFragmentById(R.id.sideMenu) != null) { 
       getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
      } 
    } 

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

     try 
     { 
      setSelected = (OnMenuSelectedListener) activity; 
     } 
     catch (ClassCastException e) 
     { 
      throw new ClassCastException(activity.toString() + " must implement OnMenuSelectedListener"); 
     } 
    } 

    @Override 
    public void onListItemClick(ListView l, View v, int position, long id) 
    { 
     setSelected.onItemSelected(position); 

     // Set the item as checked to be highlighted when in two-pane layout 
     getListView().setItemChecked(position, true); 
    } 
} 

ContentPreview.java

public class ContentPreview extends Fragment 
{ 
    final static String ARG_POSITION = "position"; 
    int mCurrentPosition = -1; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     if (savedInstanceState != null) 
     { 
      mCurrentPosition = savedInstanceState.getInt(ARG_POSITION); 
     } 

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

    @Override 
    public void onStart() 
    { 
     super.onStart(); 

     Bundle args = getArguments(); 
     if (args != null) 
     { 
      updateContentPreview(args.getInt(ARG_POSITION)); 
     } 
     else if (mCurrentPosition != -1) 
     { 
      updateContentPreview(mCurrentPosition); 
     } 
    } 

    public void updateContentPreview(int position) 
    { 
     switch(position) 
     { 
      case 1: 
      { 
       TextView article = (TextView) getActivity().findViewById(R.id.contentView); 
       article.setText("Voce estava na aba Gincana"); 
       mCurrentPosition = position; 
       break; 
      } 
      case 2: 
      { 
       TextView article = (TextView) getActivity().findViewById(R.id.contentView); 
       article.setText("Voce estava na aba Tarefas"); 
       mCurrentPosition = position; 
       break; 
      } 
      case 3: 
      { 
       TextView article = (TextView) getActivity().findViewById(R.id.contentView); 
       article.setText("Voce estava na aba Ranking"); 
       mCurrentPosition = position; 
       break; 
      } 
      case 4: 
      { 
       TextView article = (TextView) getActivity().findViewById(R.id.contentView); 
       article.setText("Voce estava na aba Amigos"); 
       mCurrentPosition = position; 
       break; 
      } 
      case 5: 
      { 
       TextView article = (TextView) getActivity().findViewById(R.id.contentView); 
       article.setText("Voce estava na aba Perfil"); 
       mCurrentPosition = position; 
       break; 
      } 
      case 6: 
      { 
       TextView article = (TextView) getActivity().findViewById(R.id.contentView); 
       article.setText("Voce estava na aba Sobre"); 
       mCurrentPosition = position; 
       break; 
      } 
     } 
    } 

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

     outState.putInt(ARG_POSITION, mCurrentPosition); 
    } 
} 

PontixActivity.java

public class PontixActivity extends FragmentActivity implements SideMenu.OnMenuSelectedListener 
{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_pontix); 

     Intent intent = getIntent(); 
     int code = intent.getIntExtra(GincanaActivity.EXTRA_CONTENT,0); 

     SideMenu sideMenu = new SideMenu(); 

     sideMenu.setArguments(getIntent().getExtras()); 

     getSupportFragmentManager().beginTransaction().add(R.id.sideMenu, sideMenu).commit(); 

     ContentPreview contentFragment = (ContentPreview) getSupportFragmentManager().findFragmentById(R.id.content); 

     if (contentFragment != null) 
     { 
      contentFragment.updateContentPreview(code); 

     } 
    } 

    public void onItemSelected(int position) 
    { 
     switch(position) 
     { 
      case 0: 
      { 
       Intent contentView = new Intent(this, GincanaActivity.class); 
       startActivity(contentView); 
       break; 
      } 
      case 1: 
      { 
       Intent contentView = new Intent(this, TarefaActivity.class); 
       startActivity(contentView); 
       break; 
      } 
      case 2: 
      { 
       Intent contentView = new Intent(this, RankingActivity.class); 
       startActivity(contentView); 
       break; 
      } 
      case 3: 
      { 
       Intent contentView = new Intent(this, MainActivity.class); 
       startActivity(contentView); 
       break; 
      } 
      case 4: 
      { 
       Intent contentView = new Intent(this, MainActivity.class); 
       startActivity(contentView); 
       break; 
      } 
      case 5: 
      { 
       Intent contentView = new Intent(this, MainActivity.class); 
       startActivity(contentView); 
       break; 
      } 
     } 
    } 
} 

這是錯誤日誌。

08-03 13:13:58.745: W/IInputConnectionWrapper(13847): showStatusIcon on inactive InputConnection 
08-03 13:14:09.065: D/AbsListView(13847): Get MotionRecognitionManager 
08-03 13:14:09.065: D/AbsListView(13847): Get MotionRecognitionManager 
08-03 13:14:12.310: D/AndroidRuntime(13847): Shutting down VM 
08-03 13:14:12.310: W/dalvikvm(13847): threadid=1: thread exiting with uncaught exception (group=0x40c661f8) 
08-03 13:14:12.340: E/AndroidRuntime(13847): FATAL EXCEPTION: main 
08-03 13:14:12.340: E/AndroidRuntime(13847): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.pontix/com.example.pontix.PontixActivity}: android.view.InflateException: Binary XML file line #21: Error inflating class fragment 
08-03 13:14:12.340: E/AndroidRuntime(13847): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1970) 
08-03 13:14:12.340: E/AndroidRuntime(13847): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1995) 
08-03 13:14:12.340: E/AndroidRuntime(13847): at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3365) 
08-03 13:14:12.340: E/AndroidRuntime(13847): at android.app.ActivityThread.access$700(ActivityThread.java:128) 
08-03 13:14:12.340: E/AndroidRuntime(13847): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1165) 
08-03 13:14:12.340: E/AndroidRuntime(13847): at android.os.Handler.dispatchMessage(Handler.java:99) 
08-03 13:14:12.340: E/AndroidRuntime(13847): at android.os.Looper.loop(Looper.java:137) 
08-03 13:14:12.340: E/AndroidRuntime(13847): at android.app.ActivityThread.main(ActivityThread.java:4514) 
08-03 13:14:12.340: E/AndroidRuntime(13847): at java.lang.reflect.Method.invokeNative(Native Method) 
08-03 13:14:12.340: E/AndroidRuntime(13847): at java.lang.reflect.Method.invoke(Method.java:511) 
08-03 13:14:12.340: E/AndroidRuntime(13847): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993) 
08-03 13:14:12.340: E/AndroidRuntime(13847): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760) 
08-03 13:14:12.340: E/AndroidRuntime(13847): at dalvik.system.NativeStart.main(Native Method) 
08-03 13:14:12.340: E/AndroidRuntime(13847): Caused by: android.view.InflateException: Binary XML file line #21: Error inflating class fragment 
08-03 13:14:12.340: E/AndroidRuntime(13847): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:697) 
08-03 13:14:12.340: E/AndroidRuntime(13847): at android.view.LayoutInflater.rInflate(LayoutInflater.java:739) 
08-03 13:14:12.340: E/AndroidRuntime(13847): at android.view.LayoutInflater.rInflate(LayoutInflater.java:742) 
08-03 13:14:12.340: E/AndroidRuntime(13847): at android.view.LayoutInflater.inflate(LayoutInflater.java:489) 
08-03 13:14:12.340: E/AndroidRuntime(13847): at android.view.LayoutInflater.inflate(LayoutInflater.java:396) 
08-03 13:14:12.340: E/AndroidRuntime(13847): at android.view.LayoutInflater.inflate(LayoutInflater.java:352) 
08-03 13:14:12.340: E/AndroidRuntime(13847): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:280) 
08-03 13:14:12.340: E/AndroidRuntime(13847): at android.app.Activity.setContentView(Activity.java:1892) 
08-03 13:14:12.340: E/AndroidRuntime(13847): at com.example.pontix.PontixActivity.onCreate(PontixActivity.java:13) 
08-03 13:14:12.340: E/AndroidRuntime(13847): at android.app.Activity.performCreate(Activity.java:4562) 
08-03 13:14:12.340: E/AndroidRuntime(13847): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1053) 
08-03 13:14:12.340: E/AndroidRuntime(13847): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1934) 
08-03 13:14:12.340: E/AndroidRuntime(13847): ... 12 more 
08-03 13:14:12.340: E/AndroidRuntime(13847): Caused by: java.lang.IllegalStateException: Fragment com.example.pontix.SideMenu did not create a view. 
08-03 13:14:12.340: E/AndroidRuntime(13847): at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:295) 
08-03 13:14:12.340: E/AndroidRuntime(13847): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:669) 
08-03 13:14:12.340: E/AndroidRuntime(13847): ... 23 more 
08-03 13:14:12.355: D/dalvikvm(13847): GC_CONCURRENT freed 152K, 3% free 13194K/13575K, paused 1ms+3ms 
08-03 13:14:12.355: D/AbsListView(13847): [unregisterDoubleTapMotionListener] 
08-03 13:14:12.355: I/MotionRecognitionManager(13847): .unregisterListener :/listener count = 0->0, [email protected] 
08-03 13:14:12.355: D/AbsListView(13847): [unregisterDoubleTapMotionListener] 
08-03 13:14:12.355: I/MotionRecognitionManager(13847): .unregisterListener :/listener count = 0->0, [email protected] 
08-03 13:14:12.360: D/AbsListView(13847): [unregisterDoubleTapMotionListener] 
08-03 13:14:12.360: I/MotionRecognitionManager(13847): .unregisterListener :/listener count = 0->0, [email protected] 

回答

1

無論你的片段需要公共空構造函數:

public class SideMenu extends ListFragment 
{ 
    public SideMenu(){} 
    ... 

public class ContentPreview extends Fragment 
{ 
    public ContentPreview(){} 
    ... 
+0

與構造仍然會崩潰...任何人都知道這是爲什麼? – 2012-08-06 15:19:41

+1

您正在混合用XML定義的編程創建的片段和片段,這是一個災難處方。將XML 元素替換爲,並以編程方式(首選)執行所有操作,或者使用XML完成所有操作,並擺脫PontixActivity中的片段實例化/事務。 – 2012-08-06 17:54:13

+0

@ Error454爲我解決了它,謝謝!替換佈局中的片段引用並僅在代碼中交換片段。 – 2013-03-25 19:48:02