2012-10-01 9 views
9

मुझे टुकड़े और घूर्णन स्क्रीन के साथ एक समस्या है। मैं इस धागे को पढ़ने, और यह मेरी समस्या का समाधान नहीं:टुकड़े और घूर्णन स्क्रीन समस्याओं

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; 

    } 

....

और केवल जब मैं टैब बदलने के लिए, और मैं अपने डिवाइस बारी बारी से करने के बाद, मैं एक एफसी हो और 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 

सभी को धन्यवाद।

उत्तर

16

मुझे समाधान मिला। जब आप गतिशील टुकड़ों का उपयोग करते हैं, तो आपको एक लेआउट का उपयोग करना होगा, और इसके अंदर टुकड़ा डालना होगा।

उदाहरण के लिए: मुख्य गतिविधि उपयोग इस लेआउट:

<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(); 
+1

धन्यवाद, यह मेरे लिए काम करता है। मेरे पास तत्व था जो WebViewFragment लोड कर रहा था और यह पूरी तरह से पागल हो रहा था। फ्रेमलेआउट में बदलकर, यह बहुत अच्छा काम करता है :) –