片段和旋转屏幕问题
问题描述:
我有一个片段和旋转屏幕的问题。我读这线程,它并没有解决我的问题:片段和旋转屏幕问题
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 start, 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();
谢谢,这对我有效。我有一个加载WebViewFragment的元素,它完全是疯了。通过更改为FrameLayout,它工作得很好:) –