【发布时间】:2012-02-23 15:31:57
【问题描述】:
我正在使用 XML 标记
android:configChanges="orientation|keyboardHidden|keyboard"
以及以下代码来检测设备方向变化和更改布局:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
disp = getWindowManager().getDefaultDisplay();
swidth = disp.getWidth();
sheight = disp.getHeight();
parent.removeAllViews();
parent = new RelativeLayout(this);
if(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT)
layoutPortrait();
else
layoutLandscape();
}
这可以很好地从纵向到横向。但是,无论出于何种原因,从横向切换到纵向(从横向开始或切换到然后返回)都不会将屏幕改回纵向。
通过使用日志消息,我确定在横向模式下,显示和配置类不会更新。它们保持与设备处于横向时相同的方向/长度/宽度值。
有人知道这是为什么吗?
附加代码(由贡献者要求)
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
disp = getWindowManager().getDefaultDisplay();
swidth = disp.getWidth();
sheight = disp.getHeight();
int ornt;
if(swidth == sheight)
ornt = Configuration.ORIENTATION_SQUARE;
else if(swidth < sheight)
ornt = Configuration.ORIENTATION_PORTRAIT;
else if(swidth > sheight)
ornt = Configuration.ORIENTATION_LANDSCAPE;
else
ornt = Configuration.ORIENTATION_UNDEFINED;
parent = new RelativeLayout(this);
labelOne = new TextView(this);
labelOne.setText("Temperature");
labelOne.setId((int)(Math.random()*Integer.MAX_VALUE));
temp = new EditText(this);
temp.setSingleLine(true);
temp.setBackgroundColor(Color.WHITE);
temp.setTextColor(Color.BLACK);
temp.setId((int)(Math.random()*Integer.MAX_VALUE));
labelTwo = new TextView(this);
labelTwo.setText("Humidity(%)");
labelTwo.setId((int)(Math.random()*Integer.MAX_VALUE));
humidity = new EditText(this);
humidity.setSingleLine(true);
humidity.setBackgroundColor(Color.WHITE);
humidity.setTextColor(Color.BLACK);
humidity.setId((int)(Math.random()*Integer.MAX_VALUE));
output = new TextView(this);
output.setBackgroundColor(Color.WHITE);
output.setTextColor(Color.BLACK);
output.setId((int)(Math.random()*Integer.MAX_VALUE));
submit = new Button(this);
submit.setText("Calculate");
submit.setId((int)(Math.random()*Integer.MAX_VALUE));
submit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Double result = Calculate.calculate(getInputs());
if(result !=null) {
String answer = String.format("%,.1f",result);
if(f.isChecked()) {
output.setText(answer + "°F");
} else {
output.setText(answer + "°C");
}
}
}
});
f = new RadioButton(this);
f.setText("Fahrenheit");
c = new RadioButton(this);
c.setText("Celsius");
rg = new RadioGroup(this);
rg.setOnCheckedChangeListener(new ListenForMode());
rg.addView(f);
rg.addView(c);
rg.setId((int)(Math.random()*Integer.MAX_VALUE));
f.setChecked(true);
if(ornt == Configuration.ORIENTATION_PORTRAIT || ornt == Configuration.ORIENTATION_SQUARE)
layoutPortrait();
else
layoutLandscape();
}
最终更新
问题在于模拟器没有正确响应方向变化。我更改了 onConfigurationChanged(...) 方向检查,将条件宽度
感谢所有对此问题的贡献者!
【问题讨论】:
-
为什么不让 Android 通过提供备用资源来为您处理布局切换?
-
第二个。另外,您的 layoutLandScape 例程是否会调用 setRequestedOrientation?执行此操作后,您将不再收到有关方向更改的通知。
-
@LawrenceD'Oliveiro 不是它不调用该方法。它只是重新绘制布局以使用横向视图。
-
您没有回退调用您的布局之一。您应该将
if else if重构为if else。检查纵向,如果没有,横向忽略其余部分...(不会解决您的问题,但应该更健壮) -
@bschultz 您所说的替代资源是指 BMP GUI 布局吗?我不知道如何制作这些,我宁愿尽可能多地用纯 Java 编写程序,因为这是我所知道和喜爱的。
标签: android user-interface orientation emulation config