10

構成の変更を処理するようにアクティビティを設定しましたが、動作しonConfigurationChanged()ます。つまり、方向が変更されたときに呼び出されます。

アクティビティには、方向を明示的に変更するためのボタンがあります。クリックすると、 が呼び出され setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT)ました。

その後、向きは取り消し不能に設定され、onConfigurationChanged()呼び出されなくなります。

コールバックを失わずにユーザーがボタンをクリックしたときに向きを変更するにはどうすればよいonConfigurationChanged()ですか?

4

5 に答える 5

8

これが私がそれを解決した方法です。私はそれが車輪の再発明であることを知っていますが、それは私の要件を満たし、標準の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);
}
}

次に、アクティビティで実装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ませんが、マニフェストに次の行を保持します:android:configChanges = "orientation | screenSize"

于 2012-12-12T16:31:46.380 に答える
1
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT)

これにより、onConfigurationChanged が機能しなくなります。機能させたい場合は、そのアクティビティ内のマニフェストにこれを追加してみてください。

android:configChanges="orientation|screenSize"

screenSize 属性は API 13 以降専用であるため、それ以下の場合は必要ありません

于 2012-10-25T17:04:00.960 に答える