Java 不要在旋转时加载相关的横向/纵向布局

Java 不要在旋转时加载相关的横向/纵向布局,java,android,eclipse,user-interface,android-fragments,Java,Android,Eclipse,User Interface,Android Fragments,我的Android应用程序有一个非常令人不安的问题。我正在使用片段。每个片段包含一个单独的XML文件,用于纵向UI和横向UI 如果我从片段“InputFragment”移动到片段“OutputFragment”,并且如果我现在旋转设备,片段将更改为“InputFragment”!!这意味着,应用程序将返回到旋转时的前一个片段!但是,这不是应该发生的事情。如果我在纵向旋转设备,那么它应该调用相同片段的横向UI,反之亦然 下面是代码。我只显示代码的结构,因为所有其他都是变量声明和赋值等 InputF

我的Android应用程序有一个非常令人不安的问题。我正在使用
片段
。每个片段包含一个单独的XML文件,用于纵向UI和横向UI

如果我从片段“
InputFragment
”移动到片段“
OutputFragment
”,并且如果我现在旋转设备,片段将更改为“
InputFragment
”!!这意味着,应用程序将返回到旋转时的前一个片段!但是,这不是应该发生的事情。如果我在纵向旋转设备,那么它应该调用相同片段的横向UI,反之亦然

下面是代码。我只显示代码的结构,因为所有其他都是变量声明和赋值等

InputFragment.java

public class InputFragment extends Fragment {

    //Declaring variables. CODE REMOVED




    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        //Intializing instance variables. CODE REMOVED

        view = inflater.inflate(R.layout.input, container,false);



        restoreStates(savedInstanceState);

        return view;

    }

    //This method will save the instances
    @Override
    public void onSaveInstanceState(Bundle savedInstanceStateBundle) 
    {
        super.onSaveInstanceState(savedInstanceStateBundle);

        try{

        }
        catch(NullPointerException e)
        {

        }
    }

    //This method will restore the instances
    @Override 
    public void onActivityCreated(Bundle savedInstanceStateBundle)
    {
        super.onActivityCreated(savedInstanceStateBundle);

        if(savedInstanceStateBundle!=null)
        {
        }
    }

    //Action Listener for the Submit Bar
    private class SubmitButtonAction implements OnClickListener
    {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            try {
                //Put the JSON. Calling to the JSON handling class. CODE REMOVED


            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace(); 
            }

            Fragment frag = new OutputFragment();

            FragmentTransaction ft = getFragmentManager().beginTransaction();   
            ft.replace(R.id.fragment_container, frag);
            ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
            ft.addToBackStack(null);
            ft.commit();



        }

    }



    private void restoreStates(Bundle savedInstanceStateBundle)
    {
        if(savedInstanceStateBundle!=null)
        {

        }
    }




}
public class OutputFragment extends Fragment implements AsyncResponse{

    //Delclaring variables. CODE REMOVED


    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        //Intializing instance variables. CODE REMOVED
        view = inflater.inflate(R.layout.output, container,false);


        return view;

    }


    //ActionListener for the manual back button
    private class BackButtonAction implements OnClickListener
    {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            FragmentManager fm = getFragmentManager(); 
            fm.popBackStackImmediate();

        }

    }


    @Override
    public void processFinish(String output) {
        // TODO Auto-generated method stub
        Log.d("OUTPUT_FRAGMENT", output);

        try {





            progressDialog.dismiss();

        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}
    import android.os.Bundle;
    import android.app.Activity;
    import android.content.Intent;
    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentActivity;
    import android.support.v4.app.FragmentTransaction;
    import android.view.Menu;
    import android.view.Window;

    public class MainActivity extends FragmentActivity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            this.requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.activity_main);


            Fragment frag = new InputFragment();

            FragmentTransaction ft = getSupportFragmentManager().beginTransaction();    
            ft.replace(R.id.fragment_container, frag);
            ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
            ft.addToBackStack(null);
            ft.commit();
        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }



}
OutputFragment.Java

public class InputFragment extends Fragment {

    //Declaring variables. CODE REMOVED




    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        //Intializing instance variables. CODE REMOVED

        view = inflater.inflate(R.layout.input, container,false);



        restoreStates(savedInstanceState);

        return view;

    }

    //This method will save the instances
    @Override
    public void onSaveInstanceState(Bundle savedInstanceStateBundle) 
    {
        super.onSaveInstanceState(savedInstanceStateBundle);

        try{

        }
        catch(NullPointerException e)
        {

        }
    }

    //This method will restore the instances
    @Override 
    public void onActivityCreated(Bundle savedInstanceStateBundle)
    {
        super.onActivityCreated(savedInstanceStateBundle);

        if(savedInstanceStateBundle!=null)
        {
        }
    }

    //Action Listener for the Submit Bar
    private class SubmitButtonAction implements OnClickListener
    {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            try {
                //Put the JSON. Calling to the JSON handling class. CODE REMOVED


            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace(); 
            }

            Fragment frag = new OutputFragment();

            FragmentTransaction ft = getFragmentManager().beginTransaction();   
            ft.replace(R.id.fragment_container, frag);
            ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
            ft.addToBackStack(null);
            ft.commit();



        }

    }



    private void restoreStates(Bundle savedInstanceStateBundle)
    {
        if(savedInstanceStateBundle!=null)
        {

        }
    }




}
public class OutputFragment extends Fragment implements AsyncResponse{

    //Delclaring variables. CODE REMOVED


    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        //Intializing instance variables. CODE REMOVED
        view = inflater.inflate(R.layout.output, container,false);


        return view;

    }


    //ActionListener for the manual back button
    private class BackButtonAction implements OnClickListener
    {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            FragmentManager fm = getFragmentManager(); 
            fm.popBackStackImmediate();

        }

    }


    @Override
    public void processFinish(String output) {
        // TODO Auto-generated method stub
        Log.d("OUTPUT_FRAGMENT", output);

        try {





            progressDialog.dismiss();

        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}
    import android.os.Bundle;
    import android.app.Activity;
    import android.content.Intent;
    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentActivity;
    import android.support.v4.app.FragmentTransaction;
    import android.view.Menu;
    import android.view.Window;

    public class MainActivity extends FragmentActivity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            this.requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.activity_main);


            Fragment frag = new InputFragment();

            FragmentTransaction ft = getSupportFragmentManager().beginTransaction();    
            ft.replace(R.id.fragment_container, frag);
            ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
            ft.addToBackStack(null);
            ft.commit();
        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }



}
MainActivity.java

public class InputFragment extends Fragment {

    //Declaring variables. CODE REMOVED




    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        //Intializing instance variables. CODE REMOVED

        view = inflater.inflate(R.layout.input, container,false);



        restoreStates(savedInstanceState);

        return view;

    }

    //This method will save the instances
    @Override
    public void onSaveInstanceState(Bundle savedInstanceStateBundle) 
    {
        super.onSaveInstanceState(savedInstanceStateBundle);

        try{

        }
        catch(NullPointerException e)
        {

        }
    }

    //This method will restore the instances
    @Override 
    public void onActivityCreated(Bundle savedInstanceStateBundle)
    {
        super.onActivityCreated(savedInstanceStateBundle);

        if(savedInstanceStateBundle!=null)
        {
        }
    }

    //Action Listener for the Submit Bar
    private class SubmitButtonAction implements OnClickListener
    {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            try {
                //Put the JSON. Calling to the JSON handling class. CODE REMOVED


            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace(); 
            }

            Fragment frag = new OutputFragment();

            FragmentTransaction ft = getFragmentManager().beginTransaction();   
            ft.replace(R.id.fragment_container, frag);
            ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
            ft.addToBackStack(null);
            ft.commit();



        }

    }



    private void restoreStates(Bundle savedInstanceStateBundle)
    {
        if(savedInstanceStateBundle!=null)
        {

        }
    }




}
public class OutputFragment extends Fragment implements AsyncResponse{

    //Delclaring variables. CODE REMOVED


    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        //Intializing instance variables. CODE REMOVED
        view = inflater.inflate(R.layout.output, container,false);


        return view;

    }


    //ActionListener for the manual back button
    private class BackButtonAction implements OnClickListener
    {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            FragmentManager fm = getFragmentManager(); 
            fm.popBackStackImmediate();

        }

    }


    @Override
    public void processFinish(String output) {
        // TODO Auto-generated method stub
        Log.d("OUTPUT_FRAGMENT", output);

        try {





            progressDialog.dismiss();

        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}
    import android.os.Bundle;
    import android.app.Activity;
    import android.content.Intent;
    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentActivity;
    import android.support.v4.app.FragmentTransaction;
    import android.view.Menu;
    import android.view.Window;

    public class MainActivity extends FragmentActivity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            this.requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.activity_main);


            Fragment frag = new InputFragment();

            FragmentTransaction ft = getSupportFragmentManager().beginTransaction();    
            ft.replace(R.id.fragment_container, frag);
            ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
            ft.addToBackStack(null);
            ft.commit();
        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }



}
清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.xxx.xxx"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-permission android:name="android.permission.INTERNET" />

    <uses-sdk
        android:minSdkVersion="11"
        android:targetSdkVersion="18" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/xxx_logo"
        android:label="@string/xxx"
        android:theme="@style/AppTheme">
        <activity
            android:name="com.xxx.xxx.MainActivity"
            android:configChanges="keyboardHidden|screenLayout|orientation|screenSize"
            android:label="@string/xxx" >

        </activity>
        <activity
            android:name="com.xxx.xxx.SplashScreen"
            android:configChanges="keyboardHidden|screenLayout|orientation|screenSize"
            android:label="@string/xxx" >

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

经过数小时的搜索,我找到了一个解决方案来解决这个问题。也就是说,将代码
android:configChanges=“keyboardHidden | screenLayout | orientation | screenSize”
添加到清单文件中


现在,片段在旋转时不会移动到上一个片段,但是,它也不会加载其他布局!这意味着,如果我将手机从纵向旋转到横向,则不会加载“横向”用户界面,反之亦然!它只是试图调整自己以适应视图,这是不好的,因为在没有加载其他相关UI的情况下,图像和所有内容都会显示不好。这里发生了什么事

旋转后,将重新创建活动,并调用其
onCreate()
方法。 您要做的是检查活动是否第一次启动,然后用
InputFragment
替换片段。在Activity first creation上,savedInstanceState为空,因此可以执行以下操作:

if(savedInstanceState == null) {
    // replace fragment 
}
编辑:

这是活动中的
onCreate()
的外观:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);

        if(savedInstanceState == null) {
            Fragment frag = new InputFragment();

            FragmentTransaction ft = getSupportFragmentManager().beginTransaction();    
            ft.replace(R.id.fragment_container, frag);
            ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
            ft.addToBackStack(null);
            ft.commit();
        }
    }

现在,方向更改活动不会替换您的片段,您不需要在清单中设置任何属性

您的布局不会更改,因为您使用了
android:configChanges
attr,这基本上是为了防止布局在旋转时重新创建而不是在片段中,在活动的
onCreate
方法中。将碎片事务代码放在那里。请记住删除清单中的
configChanges
attr。这似乎有效,但它包含一个问题。“public void processFinish(字符串输出)”方法开始运行。这是一种回调方法。InputFragment处理网络操作,执行此操作时,它将移动到OutputFragment以显示结果。输出片段在“processFinish()”中显示一个进度对话框,一旦操作完成,它将关闭对话框并显示结果,这意味着图像。在这里,它只显示进度对话框(这是不需要的),什么也不做。