Android:如何为View设置方向

时间:2015-11-03 11:27:33

标签: android orientation

我有一项服务,在启动时,一个View出现在所有视图之上。

如果我将手机旋转到横向,则视图方向会变为横向,但我只想制作视图肖像。我怎么能这样做?

6 个答案:

答案 0 :(得分:2)

@Override
public void onCreate(Bundle savedInstanceState) {
      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); }

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

答案 1 :(得分:1)

要声明您的活动处理配置更改,请在清单文件中编辑相应的<activity>元素,以包含android:configChanges属性,该属性的值代表您要处理的配置。

例如,以下清单代码声明了一个处理屏幕方向更改和键盘可用性更改的活动:

<activity android:name=".MyActivity"
          android:configChanges="orientation|keyboardHidden"
          android:label="@string/app_name">

现在,当其中一个配置发生更改时,MyActivity不会重新启动。相反,MyActivity接收对onConfigurationChanged()的调用。此方法传递一个Configuration对象,该对象指定新设备配置。通过阅读配置中的字段,您可以确定新配置并通过更新界面中使用的资源进行适当的更改。

例如,以下onConfigurationChanged()实现检查当前设备方向:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
    }
}

或简单

screenOrientation是activity元素的属性。 android活动的方向可以是纵向,横向,传感器,未指定等。您需要在AndroidManifest.xml文件中定义它。例如:

<activity  
            android:name="com.example.screenorientation.MainActivity"  
            android:label="@string/app_name"   
            android:screenOrientation="landscape"  
            >  

但根据我的经验,您需要设置定位Android 3.2 及更高版本,您需要同时

android:configChanges="orientation|screenSize"

参考:http://developer.android.com/guide/topics/resources/runtime-changes.html

编辑:

Android屏幕定位生命周期

我们可能会对Android活动的Android屏幕方向更改生命周期感到困惑。有时您可能会在旋转设备时观察到您的活动重新启动。有时候没有任何事以下是Android屏幕方向更改生命周期的简单规则。

<强> 1 即可。如果您已经{j}代码中的@Override onConfigurationChanged()函数(在您的Android活动类中)来处理Android屏幕方向更改。然后,您的活动将永远不会重新开始任何屏幕方向更改。

<强> 2 即可。如果您没有@Override onConfigurationChanged()按上述方式运行,那么每次设备中发生任何屏幕方向更改时,您的运行活动都会重新启动。这意味着您的活动将首先通过调用onDestroy() API销毁,然后onCreate()方法将再次调用您的运行活动来重新启动它。

第3 即可。要正确处理活动的重启状态,您需要通过正常的活动生命周期恢复其先前的状态,在此生命周期中Android操作系统会在销毁您的活动之前调用onSaveInstanceState()方法。这样您就可以保存数据(变量值)和应用程序状态。然后,您可以在活动的onCreate()onRestoreInstanceState()方法调用期间恢复之前的状态。

希望它会对你有所帮助。

答案 2 :(得分:0)

尝试在视图打开时以编程方式设置方向。

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

答案 3 :(得分:0)

在您的清单文件中,请确保设置正确的方向,如下所示:

<activity android:name=".SomeActivity"
android:label="@string/app_name"
android:screenOrientation="portrait" />

这种方式强制使用纵向模式,旋转设备时,您的应用程序不会更改为横向。

答案 4 :(得分:0)

请在下面找到一个可以更好地实现您的任务的示例。

public class MainScreenOrientation extends Activity {

    private static final String TAG = "MainScreenOrientation";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mContext = this;

        setContentView(R.layout.main_activity);

        startService(new Intent(this, MyOwnService.class) );
    }
}

在我的MyOwnService服务类

public class MyOwnService extends Service {
    private static final String TAG = "MyOwnService";
    private static Context mContext;
    private static final String BCAST_CONFIGCHANGED = "android.intent.action.CONFIGURATION_CHANGED";

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        mContext = this;

        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(BCAST_CONFIGCHANGED);
        this.registerReceiver(mBroadcastReceiver, intentFilter);
    }

    @Override
    public void onDestroy() {           
        Log.d(TAG, "onDestroy()");
        //Unregister receiver to avoid memory leaks
        mContext.unregisterReceiver(mBroadcastReceiver);
    }

    @Override
    public void onStart(Intent intent, int startid) {

    }

    public BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent myIntent) {

            if (myIntent.getAction().equals( BCAST_CONFIGCHANGED)) {

                Log.d(TAG, "received->" + BCAST_CONFIGCHANGED);


                if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){
                    // it's Landscape
                    Log.d(TAG, "LANDSCAPE");
                }
                else {
                    Log.d(TAG, "PORTRAIT");
                }
            }
        }
    };
}

最后在清单文件中

<service android:enabled="true"  android:name="com.android.example.services.MyOwnService">
            <intent-filter>
                <action android:name="android.intent.action.CONFIGURATION_CHANGED"/>
            </intent-filter>
</service>

希望它对你有所帮助。

答案 5 :(得分:0)

如果我理解正确,您希望在纵向模式下修复您的视图,但只要您旋转设备,应用程序的其余部分就会自由旋转。

在这种情况下,您需要捕捉方向更改,然后将View逆时针旋转到当前旋转。

这样的事情:

@Override
public void onConfigurationChanged(Configuration newConfig) 
{
    super.onConfigurationChanged(newConfig);
    View yourView = ....;

    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) 
    {
        yourView.setRotation(-90);
    } 
    else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT)
    {
        yourView.setRotation(90);
    }
}

您还必须编辑清单文件中的相应元素。

      <activity android:name=".MyActivity"
         android:configChanges="orientation|keyboardHidden"
         android:label="@string/app_name">

我不确定学位值,现在无法检查,你可能需要测试一下。

然而,通过这种方式,您可以始终将“视图”设置为“纵向”模式。