显示屏幕方向更改活动的问题

时间:2012-03-22 06:06:03

标签: android

其实我已经创建了一个简单的应用程序,我想在其中显示另一个关于屏幕方向变化的活动。我已经完成了堆栈溢出中给出的文档和示例,并使用此我生成了我的应用程序,并且其工作正常。但我唯一的疑问是,如果在我的主要活动的活动标签内的清单文件中,如果我使用android:screenOrientation="portrait"然后运行应用程序,那么在更改屏幕方向时我的下一个活动不会打开,但是如果我从清单中删除此代码然后它工作正常。

所以我的问题是,如果我希望我的主要活动始终以纵向模式打开,那么我应该在主要活动的清单中使用此代码。如果我这样做,那么在更改屏幕时我的下一个活动没有公开。

所以任何人都可以帮助我解决这个问题。我使用的代码是:

清单文件中的

代码

<?xml version="1.0" encoding="utf-8"?>

<uses-sdk android:minSdkVersion="8" />

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >
    <activity
        android:name=".MainActivity"
        android:configChanges="orientation"
        android:label="@string/app_name"
        android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".ChartEngineActivity"
        android:configChanges="keyboardHidden|orientation" >
    </activity>
</application>

主要活动中的

代码

public class MainActivity extends Activity
{
     @Override
     protected void onCreate(Bundle savedInstanceState) 
     {
         super.onCreate(savedInstanceState);    
         setContentView(R.layout.main);
     }

     @Override
     public void onConfigurationChanged(Configuration newConfig) 
     {
         super.onConfigurationChanged(newConfig);
         Intent intentNotes = new Intent(this, ChartEngineActivity.class);
         this.startActivity(intentNotes);   
         finish();
     }
}

4 个答案:

答案 0 :(得分:0)

通过MainActivity中的代码更改screenOrientation,如下所示:

    public class MainActivity extends Activity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            int getConf=this.getResources().getConfiguration().orientation;

           if(getConf==Configuration.ORIENTATION_PORTRAIT)
           {
              // this.setRequestedOrientation(
                 //   ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

               Toast.makeText(getBaseContext(), "ORIENTATION_PORTRAIT", Toast.LENGTH_SHORT).show();
           }
           else
           {

               Toast.makeText(getBaseContext(), "ORIENTATION_LANDSCAPE", Toast.LENGTH_SHORT).show();
               this.setRequestedOrientation(
                        ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
           }

               setContentView(R.layout.main);
        }
    }


@Override
     public void onConfigurationChanged(Configuration newConfig) 
     {
         super.onConfigurationChanged(newConfig);
         Intent intentNotes = new Intent(this, ChartEngineActivity.class);
         this.startActivity(intentNotes);   
         finish();
     }

答案 1 :(得分:0)

而不是

   android:screenOrientation="portrait"

使用

android:screenOrientation="sensorPortrait"

Portrait orientation, but can be either normal or reverse portrait based on the device sensor. Added in API level 9.

可能这有点帮助... 这将调用

onConfigurationChanged(Configuration newConfig) also..

答案 2 :(得分:0)

首先不要改变你的清单中的方向......并且不要修改方向也.. 然后在oncreate 喜欢这个

    @Override
   public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    int k=getResources().getConfiguration().orientation;
              if(k==Configuration.ORIENTATION_LANDSCAPE){
                  Intent intentNotes = new Intent(this, ChartEngineActivity.class);
     this.startActivity(intentNotes);   
     finish();
    }
    @Override
 public void onConfigurationChanged(Configuration newConfig) 
 {
     super.onConfigurationChanged(newConfig);
     if(k==Configuration.ORIENTATION_LANDSCAPE){
                  Intent intentNotes = new Intent(this, ChartEngineActivity.class);
     this.startActivity(intentNotes);   
     finish();
  }
 }

    }

答案 3 :(得分:0)

假设您共有3项活动,它们是Main,Activity1和Activity2。

您首先在清单中声明所有三个活动,但不设置配置屏幕方向的属性。

假设您的主要活动正在开始活动1。

现在来到Activity1。 Activity1处于纵向模式并显示listview。 因此Activity1的onCreate()方法检查活动的方向,如果方向处于横向模式,则启动Activity2并在Activity1中完成Activity1 else显示列表视图。并在onConfigurationChanged中再添加一个内容方法检查新配置,如果是横向模式,则启动Activity2并完成Activity1。

现在来到Activity2。 Activity2处于横向模式,例如它正在显示Gridview。 因此,onCreate() Activity2的方法检查方向,如果orientation是Portrait然后启动Activity1并完成Activity2,则在Activity2中显示Gridview。并在onConfigurationChanged方法中再添加一项内容,检查新配置,如果它是纵向模式启动Activity1并完成Activity2。

如何检查配置

int getConf=this.getResources().getConfiguration().orientation;
if(getConf==Configuration.ORIENTATION_PORTRAIT) {
    //Portrait
}else {
    //Landscape
}

活动1应如下所示

int getConf=this.getResources().getConfiguration().orientation;
if(getConf==Configuration.ORIENTATION_LANDSCAPE) {
    startActivity(new Intent(this, Activity2.class))
    finish();
}

活动2将如下所示

int getConf=this.getResources().getConfiguration().orientation;
if(getConf==Configuration.ORIENTATION_PORTRAIT) {
    startActivity(new Intent(this, Activity1.class))
    finish();
}

同样地,您必须覆盖onConfigurationChanged方法并检查我们上面检查的方向,并采取适当的操作,就像我们开始新的活动并完成当前的活动一样。