android – 片段和旋转屏幕问题

前端之家收集整理的这篇文章主要介绍了android – 片段和旋转屏幕问题前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有碎片和旋转屏幕的问题.我读了这个主题,并没有解决我的问题:

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();
原文链接:https://www.f2er.com/android/310401.html

猜你在找的Android相关文章