3

我准备了一个应用程序。我的应用程序将支持横向和纵向。当我将方向从纵向更改为横向时,它工作正常,但是当我将横向更改为纵向时,它不起作用。我的代码是,

  public void onConfigurationChanged(Configuration newConfig) {

        super.onConfigurationChanged(newConfig);
        System.out.println("orientation---"+getResources().getConfiguration().orientation);
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            setContentView(R.layout.main);
            System.out.println("landscape-----");
        } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
            setContentView(R.layout.main);
            System.out.println("portrait-----");
        }

    }

每次它只采用横向模式。我在某些地方犯了错误。请帮忙。

System.out.println("orientation---"+getResources().getConfiguration().orientation);

上面的 SOP 打印 2 表示横向。请帮助我。(我使用的是 2.3.3)

4

3 回答 3

2

您可能会遇到这个错误“在 2.3 上的模拟器上,方向不会从横向变为纵向”

超过 45 人在使用 androidd 2.3 模拟器时面临同样的问题

http://code.google.com/p/android/issues/detail?id=13189

主机操作系统:Windows 7 SDK 工具版本:修订版 8 Eclipse 版本:3.5 ADT 插件版本:8.0.1 项目目标平台:2.3 模拟器中运行的平台版本:2.3

重现步骤: 1. 活动 1(无屏幕方向)- 活动 2(屏幕方向 = 横向)

  1. 从活动 1 到 2 工作正常。按返回将 Activity 1 的方向更改为横向

预期结果:活动 1 应为纵向模式

观察结果:仅在姜饼中观察到行为,在 froyo 上按预期工作。

于 2012-03-05T12:09:00.623 回答
2

问题在于android:configChanges="orientation|keyboardHidden".

如果您|keyboardHidden从 androidmanifest.xml 中删除,则仅当您从横向旋转到纵向时才会触发 onConfigurationChanged,而不是当您从纵向转到横向时(至少在默认模拟器中)。

希望这可以帮助。

编辑:做了一些示例程序来测试它并且对我来说很好。

CheckOrientationActivity.java

import android.content.res.Configuration;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

public class CheckOrientationActivity extends Activity {


    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_layout);
        Log.i("DayElevenActivity", "onCreate Start");
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        Log.i("DayElevenActivity", "onConfigurationChanged");
        // Checks the orientation of the screen
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            Log.i("ORIENTATION_LANDSCAPE", "ORIENTATION_LANDSCAPE");
            Toast.makeText(getBaseContext(), "ORIENTATION_LANDSCAPE", Toast.LENGTH_SHORT).show();
        } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
            Log.i("ORIENTATION_PORTRAIT", "ORIENTATION_PORTRAIT");
            Toast.makeText(getBaseContext(), "ORIENTATION_PORTRAIT", Toast.LENGTH_SHORT).show();
        }
    }

}

AndroidManifest.xml中

<activity
            android:label="@string/app_name"   
            android:configChanges="**orientation|keyboardHidden**"    
            android:name=".CheckOrientationActivity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />

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

运行和更改方向时的相应日志

03-05 18:54:31.644: I/CheckOrientationActivity (20314): onCreate Start
03-05 18:54:35.014: I/CheckOrientationActivity (20314): onConfigurationChanged
03-05 18:54:35.014: I/ORIENTATION_LANDSCAPE(20314): ORIENTATION_LANDSCAPE
03-05 18:54:41.984: I/CheckOrientationActivity (20314): onConfigurationChanged
03-05 18:54:41.984: I/ORIENTATION_PORTRAIT(20314): ORIENTATION_PORTRAIT
于 2012-03-05T12:35:46.167 回答
1

发生这种情况的原因有很多,如果不看更多代码就很难说清楚。

这里有一些提示:

  • 您没有通过清单文件或以编程方式(类似于<activity android:screenOrientation="portrait">清单中的内容)强制布局到某个特定方向

  • 默认情况下,当配置更改发生时,Activity 会重新启动。如果您不想在方向更改时重新启动活动,则需要使用

    android:configChanges="方向"

在清单中您的活动配置上。

  • onConfigurationChanged(Configuration)当方向改变时,以上几点实际上会让Android调用你的Activity的方法

==更新==

此外,如果您在 layout-land 和 layout-port 中声明了相同的布局(如“main”),您只需指定要在开始时使用该布局:

 public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

就是这样。没有必要也实施

public void onConfigurationChanged(Configuration newConfig) {
  //...
}

方法也是。为了根据方向选择正确的布局,您所要做的就是在这两个文件夹中声明相同的布局。

(另外,没有必要将它添加 android:configChanges="orientation"到您的清单中,显然它是默认开启的)。我刚刚尝试了所有这些,工作正常

于 2012-03-05T12:12:44.600 回答