我准备了一个应用程序。我的应用程序将支持横向和纵向。 当我将方向从纵向更改为横向时,它工作正常,但当我将横向更改为纵向时,它无法正常工作。我的代码是,
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)
答案 0 :(得分: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到2工作正常。按向后将活动1的方向更改为横向
醇>预期结果:活动1应处于纵向模式
观察结果:仅在姜饼中观察到行为,如同 期待在froyo。
答案 1 :(得分:2)
问题在于android:configChanges="orientation|keyboardHidden"
。
如果从androidmanifest.xml中删除|keyboardHidden
,则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
答案 2 :(得分:1)
为什么会发生这种情况有很多原因,如果没有更多的代码就很难说清楚。
这里有一些指示:
您没有通过清单文件或编程方式将布局强制转换为某个特定方向(例如清单中的<activity android:screenOrientation="portrait">
)
默认情况下,在配置更改发生时重新启动Activity。如果您希望在方向更改时不重新启动活动,则需要使用
机器人:configChanges = “取向”
关于活动在清单中的配置。
onConfigurationChanged(Configuration)
方法==更新==
另外,如果你在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"
添加到您的清单中,显然默认情况下它已启用)。我刚刚尝试了这一切,工作正常