我有碎片和旋转屏幕的问题.我读了这个主题,并没有解决我的问题:
Fragment without a view crashes on configuration change(不完全一样)
IllegalStateException when replacing a Fragment(不解决我的问题)
我只有一个活动:
public class MainActivity extends FragmentActivity implements TabSelectedListener { /** Application tab menu */ private TopMenu menu; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); menu = (TopMenu) this.findViewById(R.id.menu); menu.setListener(this); }//onCreate @Override protected void onSaveInstanceState(Bundle outState) { // TODO Auto-generated method stub super.onSaveInstanceState(outState); } public void tabSelected(int tab) { FragmentManager fragmentManager = this.getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); Fragment f = null; boolean logged = DataController.getInstance().getLogged(); switch(tab){ case TopMenu.TAB1: if( !logged ){ f = new HomeFragment(); }else{ f = new AccountsFragment(); } break; case TopMenu.TAB2: // i create more fragments depending the tab } if( f != null){ // Replace whatever is in the fragment view with this fragment,// and add the transaction to the back stack fragmentTransaction.replace(R.id.fragment,f); fragmentTransaction.addToBackStack(null); // Commit the transaction fragmentTransaction.commit(); } }//tabSelected public void setSelectedTab(int tab){ menu.setSelectedTab(tab); } ..... }
而片段的代码是:
public class HomeFragment extends Fragment implements OnClickListener{ private static final String KEY_STATE_BUNDLE = "HomeFragmentManagerState"; private LocalActivityManager mLocalActivityManager; View homeRelative; View homeLocked; View homeUnlocked; EditText id; Button ok; ImageView lock; CheckBox remember; private boolean lock_state; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Bundle state = null; if (savedInstanceState != null) { state = savedInstanceState.getBundle(KEY_STATE_BUNDLE); lock_state=savedInstanceState.getBoolean("lock_state"); } else { lock_state=true; } mLocalActivityManager = new LocalActivityManager(getActivity(),true); mLocalActivityManager.dispatchCreate(state); } @Override public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) { // Inflate the layout for this fragment View view = inflater.inflate(R.layout.fragment_home,container,false); homeRelative = view.findViewById(R.id.home_relative); homeLocked = view.findViewById(R.id.ly_home_buttonlogin); homeLocked.setOnClickListener(this); homeUnlocked = view.findViewById(R.id.ly_home_buttonlogin_unlocked); id = (EditText) view.findViewById(R.id.userid); ok = (Button) view.findViewById(R.id.useridok); ok.setEnabled(false); // ?? if id.equalsIgnoreCase("") ok.setOnClickListener(this); lock = (ImageView) view.findViewById(R.id.iv_home_candado); lock.setOnClickListener(this); if (!lock_state) animatelogon(true); remember = (CheckBox) view.findViewById(R.id.remember); id.addTextChangedListener(new TextWatcher(){ public void afterTextChanged(Editable s) { ok.setEnabled(!id.getText().toString().equalsIgnoreCase("")); id.setBackgroundResource(R.drawable.bordercolorblack_rightsquare); } public void beforeTextChanged(CharSequence s,int start,int count,int after){} public void onTextChanged(CharSequence s,int before,int count){} }); return view; }
….
只有当我更改标签,并且在我旋转我的设备后,我得到一个FC和logcat是这样的:
10-01 14:04:07.561: E/AndroidRuntime(11759): FATAL EXCEPTION: main 10-01 14:04:07.561: E/AndroidRuntime(11759): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.stkaction.sov/com.stkaction.sov.MainActivity}: android.view.InflateException: Binary XML file line #12: Error inflating class fragment 10-01 14:04:07.561: E/AndroidRuntime(11759): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1967) 10-01 14:04:07.561: E/AndroidRuntime(11759): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1992) 10-01 14:04:07.561: E/AndroidRuntime(11759): at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3362) 10-01 14:04:07.561: E/AndroidRuntime(11759): at android.app.ActivityThread.access$700(ActivityThread.java:127) 10-01 14:04:07.561: E/AndroidRuntime(11759): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1162) 10-01 14:04:07.561: E/AndroidRuntime(11759): at android.os.Handler.dispatchMessage(Handler.java:99) 10-01 14:04:07.561: E/AndroidRuntime(11759): at android.os.Looper.loop(Looper.java:137) 10-01 14:04:07.561: E/AndroidRuntime(11759): at android.app.ActivityThread.main(ActivityThread.java:4511) 10-01 14:04:07.561: E/AndroidRuntime(11759): at java.lang.reflect.Method.invokeNative(Native Method) 10-01 14:04:07.561: E/AndroidRuntime(11759): at java.lang.reflect.Method.invoke(Method.java:511) 10-01 14:04:07.561: E/AndroidRuntime(11759): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:986) 10-01 14:04:07.561: E/AndroidRuntime(11759): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:753) 10-01 14:04:07.561: E/AndroidRuntime(11759): at dalvik.system.NativeStart.main(Native Method) 10-01 14:04:07.561: E/AndroidRuntime(11759): Caused by: android.view.InflateException: Binary XML file line #12: Error inflating class fragment 10-01 14:04:07.561: E/AndroidRuntime(11759): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:697) 10-01 14:04:07.561: E/AndroidRuntime(11759): at android.view.LayoutInflater.rInflate(LayoutInflater.java:739) 10-01 14:04:07.561: E/AndroidRuntime(11759): at android.view.LayoutInflater.inflate(LayoutInflater.java:489) 10-01 14:04:07.561: E/AndroidRuntime(11759): at android.view.LayoutInflater.inflate(LayoutInflater.java:396) 10-01 14:04:07.561: E/AndroidRuntime(11759): at android.view.LayoutInflater.inflate(LayoutInflater.java:352) 10-01 14:04:07.561: E/AndroidRuntime(11759): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:272) 10-01 14:04:07.561: E/AndroidRuntime(11759): at android.app.Activity.setContentView(Activity.java:1835) 10-01 14:04:07.561: E/AndroidRuntime(11759): at com.stkaction.sov.MainActivity.onCreate(MainActivity.java:29) 10-01 14:04:07.561: E/AndroidRuntime(11759): at android.app.Activity.performCreate(Activity.java:4470) 10-01 14:04:07.561: E/AndroidRuntime(11759): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1052) 10-01 14:04:07.561: E/AndroidRuntime(11759): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1931) 10-01 14:04:07.561: E/AndroidRuntime(11759): ... 12 more 10-01 14:04:07.561: E/AndroidRuntime(11759): Caused by: java.lang.IllegalStateException: Fragment com.com.stkaction.sov.HomeFragment did not create a view. 10-01 14:04:07.561: E/AndroidRuntime(11759): at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:293) 10-01 14:04:07.561: E/AndroidRuntime(11759): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:669) 10-01 14:04:07.561: E/AndroidRuntime(11759): ... 22 more
谢谢大家.
解决方法
我找到了解决方案.当您使用动态片段时,您必须使用布局,并将片段放在其中.
例如:
主要活动使用此布局:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:id="@+id/activity_main_layout"> <com.myproyect.TopMenu android:id="@+id/menu" android:layout_width="match_parent" android:layout_height="wrap_content" /> <!-- this was the problem <fragment android:id="@+id/fragment" android:layout_width="match_parent" android:layout_height="match_parent" class="com.myproyect.HomeFragment" android:layout_below="@id/menu" /> --> <FrameLayout android:id="@+id/fragment" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@id/menu"/> <LinearLayout android:id="@+id/menu_layout" android:layout_width="175dp" android:layout_height="wrap_content" android:background="@drawable/menu_filtros" android:layout_marginRight="5dp" android:layout_below="@id/menu" android:layout_marginTop="-47dp" android:layout_alignParentRight="true" android:visibility="gone" android:orientation="vertical"> </LinearLayout> </RelativeLayout>
我实例化了FrameLayout中的片段.
fragmentTransaction.replace(R.id.fragment,f); fragmentTransaction.addToBackStack(null); fragmentTransaction.commit();