2012-10-01 5 views
9

Ich habe ein Problem mit Fragmenten und rotierenden Bildschirm. Ich lese diese Themen, und es hat mein Problem nicht lösen:Fragmente und rotierende Bildschirm Probleme

Fragment without a view crashes on configuration change (ist nicht genau das gleiche)

IllegalStateException when replacing a Fragment (nicht mein Problem lösen)

Ich habe nur eine Aktivität:

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); 
    } 


..... 
} 

Und der Code des Fragments:

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; 

    } 

....

Und nur, wenn ich das Register zu wechseln, und nachdem ich mein Gerät drehen, bekomme ich einen FC und die logcat ist dies:

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 

Vielen Dank an alle.

Antwort

16

Ich fand die Lösung. Wenn Sie dynamische Fragmente verwenden, müssen Sie ein Layout verwenden und das Fragment darin einfügen.

Zum Beispiel: Die Haupttätigkeit Verwendung dieses Layout:

<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> 

Und ich instanziiert das Fragment in der FrameLayout.

+1

Danke, das hat für mich funktioniert. Ich hatte ein Element, das ein WebViewFragment geladen wurde und es wurde völlig verrückt. Durch den Wechsel zu FrameLayout funktionierte es großartig :) –