gpt4 book ai didi

android - 使用 setRequestedConfiguration 后不会调用 onConfigurationChanged

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:30:42 25 4
gpt4 key购买 nike

我已经设置了 am Activity 来处理配置更改并且它有效,这意味着当方向更改时调用 onConfigurationChanged()

该 Activity 有一个按钮可以明确更改方向。单击时,它会调用 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT)

然后不可撤销地设置方向并且不再调用 onConfigurationChanged()

当用户单击按钮时如何在不丢失 onConfigurationChanged() 回调的情况下更改方向?

最佳答案

我就是这样解决的。我知道这是在重新发明轮子,但它满足了我的要求,但我没有找到使用标准 sdk 工具处理此问题的正确方法。

首先,创建一个监听方向变化的OrientationManager

public class OrientationManager extends OrientationEventListener{
private static final String TAG = OrientationManager.class.getName();

private int previousAngle;
private int previousOrientation;
private Context context;
private OrientationChangeListener orientationChangeListener;
private static OrientationManager instance;
private OrientationManager(Context context) {
super(context);
this.context = context;
}

public static OrientationManager getInstance(Context context){
if (instance == null){
instance = new OrientationManager(context);
}
return instance;
}

public int getOrientation(){
return previousOrientation;
}

public void setOrientation(int orientation){
this.previousOrientation = orientation;
}


@Override
public void onOrientationChanged(int orientation) {
if (orientation == -1)
return;
if(previousOrientation == 0){
previousOrientation = context.getResources().getConfiguration().orientation;
if (orientationChangeListener != null){
orientationChangeListener.onOrientationChanged(previousOrientation);
}
}
if (previousOrientation == Configuration.ORIENTATION_LANDSCAPE &&
((previousAngle > 10 && orientation <= 10) ||
(previousAngle < 350 && previousAngle > 270 && orientation >= 350)) ){
if (orientationChangeListener != null){
orientationChangeListener.onOrientationChanged(Configuration.ORIENTATION_PORTRAIT);
}
previousOrientation = Configuration.ORIENTATION_PORTRAIT;
}

if (previousOrientation == Configuration.ORIENTATION_PORTRAIT &&
((previousAngle <90 && orientation >= 90 && orientation <270) ||
(previousAngle > 280 && orientation <= 280 && orientation > 180)) ){
if (orientationChangeListener != null){
orientationChangeListener.onOrientationChanged(Configuration.ORIENTATION_LANDSCAPE);
}
previousOrientation = Configuration.ORIENTATION_LANDSCAPE;
}
previousAngle = orientation;
}

public void setOrientationChangedListener(OrientationChangeListener l){
this.orientationChangeListener = l;
}

public interface OrientationChangeListener{
public void onOrientationChanged(int newOrientation);
}
}

然后在您的 Activity 中实现 OrientationChangeListener 并覆盖 onOrientationChanged():

public class MyActivity extends Activity implements OrientationChangeListener{

private OrientationManager orientationManager;

@Override
public void onCreate(Bundle b){
orientationManager = OrientationManager.getInstance(this);
orientationManager.setOrientationChangedListener(this);

}

@Override
public void onOrientationChanged(int newOrientation) {
orientation = newOrientation;
if (newOrientation == Configuration.ORIENTATION_LANDSCAPE){
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
setLandscapeConfig();
}else{
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
setPortraitConfig();
}
}

所以我不再使用 onConfigurationChanged 但在 list 中保留以下行: android:configChanges="方向|屏幕大小"

关于android - 使用 setRequestedConfiguration 后不会调用 onConfigurationChanged,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13073500/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com