我必须解决以下问题:我有一个Activity
android:screenOrientation="portrait"
。即使当设备在Activity
可见时旋转到横向时,我必须启动另一个,并且当设备旋转回纵向时,我必须finish()
横向活动。我尝试使用BroadcastReceiver
执行此操作,但由于android:screenOrientation="portrait"
,此特殊活动不会收到任何广播。任何帮助都很受欢迎。
感谢。
答案 0 :(得分:5)
Philipp在Get phone orientation but fix screen orientation to portrait的解决方案对我来说非常合适:
您可以使用SensorManager类获取Android设备的方向,即使在Manifest中通过android禁用自动方向切换:screenOrientation =" portrait"
请参阅此代码(由Philipp,请参阅上面的链接):
SensorManager sensorManager = (SensorManager) this.getSystemService(Context.SENSOR_SERVICE);
sensorManager.registerListener(new SensorEventListener() {
int orientation=-1;;
@Override
public void onSensorChanged(SensorEvent event) {
if (event.values[1]<6.5 && event.values[1]>-6.5) {
if (orientation!=1) {
Log.d("Sensor", "Landscape");
}
orientation=1;
} else {
if (orientation!=0) {
Log.d("Sensor", "Portrait");
}
orientation=0;
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
}, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_GAME);
答案 1 :(得分:3)
当android:screenOrientation =“portrait”或“landscape”在清单文件中设置时,如果你想这样做仍然没有触发侦听器尝试以编程方式处理你的onConfigurationChanged()中的仅肖像模式,这里你也将是能够再次开始活动。
答案 2 :(得分:0)
您是否使用过Orientation Listener?我不确定这是否正是你所需要的,但是我正在收集你想知道什么时候方向来回变化:
http://developer.android.com/reference/android/view/OrientationListener.html
答案 3 :(得分:0)
您需要使用的类是OrientationEventListener,假设您可以检测旋转。如果您使用android:screenOrientation="portrait"
强制屏幕进入特定方向,则不会触发这些事件。
相反,我建议制作两个layout.xml文件并使用配置限定符来确定应显示哪个。 (http://developer.android.com/guide/practices/screens_support.html)
res/layout-land/my_layout.xml
res/layout-port/my_layout.xml
然后使用OrientationEventListener
检测屏幕何时旋转。当屏幕从横向旋转到纵向时,您可以finish();
或调用您想要的任何功能。
祝你好运!
答案 4 :(得分:0)
您始终可以使用传感器找到您的方向;
public static final int PORTRAIT = 0;
public static final int PORTRAIT_REV = 2;
public static final int LANDSCAPE = 1;
public static final int LANDSCAPE_REV = 3;
private final SensorEventListener mListener = new SensorEventListener() {
public void onSensorChanged(SensorEvent event) {
azimuth = event.values[0];
pitch = event.values[1];
roll = event.values[2];
{
if (pitch < -45 && pitch > -135) {
orient = PORTRAIT;
} else if (pitch > 45 && pitch < 135) {
orient = PORTRAIT_REV;
} else if (roll > 45) {
orient = LANDSCAPE;
} else if (roll < -45) {
orient = LANDSCAPE_REV;
}
}
// if(orient!=lastOrient && !orientChanging)
// {
// orientChangeStart = System.currentTimeMillis();
// orientChanging = true;
// }
}
答案 5 :(得分:0)
你可以通过几种方式实现,一种是收听其他帖子中讨论的广播消息,另一种选择如下。
在活动清单中设置android:configChanges="orientation"
,以便您控制方向更改。通过这样做,您可以覆盖onConfigurationChanged()
方法并开始新的活动活动。
答案 6 :(得分:0)
private void addOrientationListener()
{
OrientationEventListener listener=new OrientationEventListener(getActivity(), SensorManager.SENSOR_DELAY_UI)
{
public void onOrientationChanged(int orientation) {
if( (orientation>=230 && orientation<=290) || (orientation>=70 && orientation<=90))
{
isLandscape=true;
}
else if(orientation==-1){
//KEEP THE CURRENT SATTE
}
else
{
isLandscape=false;
}
}
};
if(listener.canDetectOrientation())
listener.enable();
}
你应该在OnPause()
上调用disable()