4

私はアクティビティを持っており、アクティビティの起動時に風景の向きを変更する必要があり、後でユーザーがデバイスを回転させたときに両方の向きの変更を処理したいのですが、一度向きを変更し、後で向きを変更しません。ここに私のコードがあります助けてください

    public class Hls extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_hls);

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);


}



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

    Log.v("new orientation", "yes");

    if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT)
    {
        Toast.makeText(this, "portrait", Toast.LENGTH_LONG).show();
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE)
    {
        Toast.makeText(this, "landscape", Toast.LENGTH_LONG).show();
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    } 

}
4

3 に答える 3

6

onCreate で setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) を使用すると、向きが永続的に横向きに固定され、向きの変更が回避されます。そのため、向きが固定され、回転に反応しません。

使用できる代替手段は次のとおりです:-

1> レイアウトに 2 つのビューを作成します。つまり、横向きビュー用と縦向きビュー用の 1 つです。たとえば、activity_hls_land と activity_hls_port とします。

2> setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) または setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) の代わりに onConfigurationChanged(Configuration newConfig ) でsetContentView(R.layout.activity_hls)を使用します。

サンプルコードは次のとおりです。

 public class MainActivity extends Activity {
boolean isLaunched=true;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        if(isLaunched){
        Toast.makeText(this, "1 st launch " , Toast.LENGTH_SHORT).show(); 
        setContentView(R.layout.activity_hls_land);
        }

    }

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

    if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT)
    {
        Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
        setContentView(R.layout.activity_hls_port);
    }
     if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE)
    {
        Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
        setContentView(R.layout.activity_hls_land );
    } 
    }

}

マニフェストで、アクティビティに android:configChanges="orientation" を追加します:-

<activity
            android:name=".MainActivity"
            android:label="@string/title_activity_main" 
            android:configChanges="orientation"
            >

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
          </activity>

activity_hls_port のサンプル レイアウト:-

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" 
    android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world"
        tools:context=".MainActivity" />
 <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world"
        tools:context=".MainActivity" />
  <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world"
        tools:context=".MainActivity" />
</LinearLayout>

ランドスケープモードのサンプル:-

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    android:orientation="vertical"
    android:rotation="90">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world"
        tools:context=".MainActivity" />
 <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world"
        tools:context=".MainActivity" />
  <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world"
        tools:context=".MainActivity" />
</LinearLayout>
于 2012-11-16T11:10:01.483 に答える
1

この声明について

if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT)
    {
        Toast.makeText(this, "portrait", Toast.LENGTH_LONG).show();
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE)
    {
        Toast.makeText(this, "landscape", Toast.LENGTH_LONG).show();
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    } 

にもonCreate(Bundle bundle);

きみが呼んだ

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

また

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

これは、アクティビティが横向き/縦向きであり、二度と回転しないことを意味します

それを削除すると、onConfigurationChanged(Configuration)再びトリガーされます

于 2012-11-16T06:15:49.577 に答える
0

あなたの要件がよくわかりません。アクティビティを再開しても構わない場合は、オーバーライドをスキップできますonConfigurationChanged。システムが向きの変更を処理します。方向の変更時に再起動したくない場合は、単に言及<activity android:configChanges="keyboardHidden|orientation|screenSize"/>し、オーバーライドonConfigurationChangedして呼び出しますsetContentView()

public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    setContentview(R.layout.activity_hls);
    initializeViews();//here you can initialize all your memberVariables using findViewbyID()
}
于 2012-11-16T06:27:45.940 に答える