onConfigurationChanged 无法正常工作

onConfigurationChanged isn't working properly

所以我要做的就是检查方向并根据它更改图像。问题是图像没有变化,toast 消息也没有起作用。不知道为什么..我在其他地方也有同样的代码。

Java:

public class Test extends AppCompatActivity {

private ArrayList<String> mNames = new ArrayList<>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.test);

    getText();

}

private void getText() {

    mNames.add("Menu");
    mNames.add("Definitions");
    mNames.add("Steps");
    mNames.add("Examples");
    mNames.add("Related");
    mNames.add("Videos");

    initRecyclerView();
}

private void initRecyclerView() {

    LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
    RecyclerView recyclerView = findViewById(R.id.recyclerView);
    recyclerView.setLayoutManager(layoutManager);
    RecyclerViewAdapter adapter = new RecyclerViewAdapter(this, mNames);
    recyclerView.setAdapter(adapter);

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

    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        setContentView(R.layout.activity_main);

        Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
        ImageView layout = findViewById(R.id.background);
        layout.setBackgroundResource(R.drawable.background_l);

    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        setContentView(R.layout.activity_main);

        Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
        ImageView layout = findViewById(R.id.background);
        layout.setBackgroundResource(R.drawable.background_p);
    }
}
}

XML:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto">

<ImageView
    android:id="@+id/background"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:scaleType="fitXY" />

<RelativeLayout
    android:id="@+id/relativeLayout2"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent">

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/recyclerView"
        android:paddingTop="5dp">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:paddingBottom="20dp">

            <TextView
                android:id="@+id/textView2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="20dp"
                android:layout_marginTop="15dp"
                android:fontFamily="@font/open_sans_bold"
                android:text="@string/definition"
                android:textColor="@color/backgroundBlue"
                android:textSize="20sp" />

            <TextView
                android:id="@+id/textView3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@id/textView2"
                android:layout_marginEnd="20dp"
                android:layout_marginStart="20dp"
                android:layout_marginTop="20dp"
                android:fontFamily="@font/open_sans"
                android:text="@string/fiveSDef1"
                android:textColor="@android:color/background_dark"
                android:textSize="14sp" />

            <TextView
                android:id="@+id/textView4"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@id/textView3"
                android:layout_marginStart="20dp"
                android:layout_marginTop="20dp"
                android:fontFamily="@font/open_sans_bold"
                android:text="@string/uses"
                android:textColor="@color/backgroundBlue"
                android:textSize="20sp" />

            <TextView
                android:id="@+id/textView5"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@id/textView4"
                android:layout_marginEnd="20dp"
                android:layout_marginStart="20dp"
                android:layout_marginTop="20dp"
                android:fontFamily="@font/open_sans"
                android:text="@string/fiveSDef2"
                android:textColor="@android:color/background_dark"
                android:textSize="14sp" />

            <TextView
                android:id="@+id/textView6"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@id/textView5"
                android:layout_marginEnd="20dp"
                android:layout_marginStart="20dp"
                android:layout_marginTop="15dp"
                android:fontFamily="@font/open_sans"
                android:text="@string/fiveSDef3"
                android:textColor="@android:color/background_dark"
                android:textSize="14sp" />

        </RelativeLayout>
    </ScrollView>

    <Button
        android:id="@+id/button2"
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:background="@color/backgroundBlue"
        android:fontFamily="@font/open_sans_bold"
        android:text="@string/fiveS"
        android:textAllCaps="false"
        android:textColor="@android:color/white"
        android:textSize="29sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        tools:layout_editor_absoluteY="0dp" />

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_below="@id/button2"
        android:layout_marginTop="15dp"
        android:orientation="horizontal" />
</RelativeLayout>

清单:

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity
        android:name=".MainActivity"
        android:configChanges="orientation|keyboardHidden|screenSize|screenLayout">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".ToolTables.1"></activity>
    <activity android:name=".ToolTables.2"
        android:windowSoftInputMode="adjustPan">
    </activity>
    <activity android:name=".ToolTables.3"></activity>
    <activity android:name=".ToolTables.4"></activity>
    <activity android:name=".ToolTables.5"></activity>
    <activity
        android:name=".Test"
        android:configChanges="orientation|keyboardHidden|screenSize|screenLayout">

    </activity>

    <meta-data
        android:name="preloaded_fonts"
        android:resource="@array/preloaded_fonts" />
</application>

编辑:我添加了其余代码。包括与 Java 耦合的 XML。它并不复杂,主要是文本字段和一个 recyclerView。

onConfigurationChanged() 回调只有在我们指定我们将在 activity 标签内的 manifest.xml 上手动管理此更改时才会被调用:

android:configChanges="orientation|screenSize|keyboardHidden"

这表明 activity 不会在设备旋转时重新创建,不推荐这种行为,除非您有正当理由这样做 ,例如youtube API 建议这样做以避免重新创建和重新初始化 YoutubePlayerFragment。

Caution: Handling the configuration change yourself can make it much more difficult to use alternative resources, because the system does not automatically apply them for you. This technique should be considered a last resort when you must avoid restarts due to a configuration change and is not recommended for most applications. https://developer.android.com/guide/topics/resources/runtime-changes

如果这不是必需的,只是您想在每个方向上都有不同的图像,您可以:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.test);

    boolean isLandscape = this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE;
    ((ImageView)findViewById(R.id.background)).setImageResource(isLandscape ? R.drawable.background_l : R.drawable.background_p);

    getText();
}