Ich lerne derzeit über das Conductor-Framework für Android und habe ein bisschen ein Problem oder ein Missverständnis, wie es funktioniert.Android Conductor: Wie Stand der Ansichten der Ausrichtung Änderungen beibehalten
I hatte den Eindruck, daß das Verfahren
setRetainViewMode (RetainViewMode.RETAIN_DETACH);
würde die Zustände der Ansichten in der Steuerung speichern. Um das Verhalten zu testen, habe ich EditText-Ansichten hinzugefügt, einen Wert eingegeben und den Bildschirm gedreht. Ich fügte auch 2 Ansichten mit onclick Listener beigefügt, Ändern der Hintergrundfarbe onclick
Das Ergebnis des Tests war, dass die EditText-Ansichten den Zustand beibehalten und die eingegebenen Werte beibehalten. Aber die 2 Ansichten, geändert auf ihre ursprüngliche Hintergrundfarbe (keine).
Dies ist das Verhalten der Ansichten unabhängig auf welchem RetainViewMode gesetzt
Ich habe diese einfache MainActivity (Anmerkung: Ich bin in Kotlin schreiben):
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
var router: Router = Conductor.attachRouter(this, controller_container, savedInstanceState)
if (!router.hasRootController()) {
var t : TestController = TestController()
t.retainViewMode = Controller.RetainViewMode.RETAIN_DETACH
router.setRoot(RouterTransaction.with(t))
}
}
companion object doTask {
fun start(activity : Activity) {
val intent = Intent(activity, MainActivity::class.java)
activity.startActivity(intent)
}
}
}
Und hier ist das der Testcontroller :
class TestController : BaseController() {
var i : Int = 0
var h : Int = 0
override fun onViewBound(view: View) {
view.a.setOnClickListener {
i++
if (i % 2 == 0) {
view.a.setBackgroundColor(ContextCompat.getColor(applicationContext, R.color.white))
} else {
view.a.setBackgroundColor(ContextCompat.getColor(applicationContext, R.color.turtle_green))
}
}
view.b.setOnClickListener {
h++
if (h % 2 == 0) {
view.b.setBackgroundColor(ContextCompat.getColor(applicationContext, R.color.white))
} else {
view.b.setBackgroundColor(ContextCompat.getColor(applicationContext, R.color.blue_light))
}
}
}
override fun inflateView(inflater: LayoutInflater, container: ViewGroup): View {
return inflater.inflate(R.layout.controller_layout_test, container, false)
}
}
und xML-Layout-Datei controller_layout_test:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<requestFocus></requestFocus>
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/logo_simple"/>
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="300dp"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_margin="30dp"
android:layout_gravity="center"
android:background="@color/transparent50p"
android:padding="20dp">
<EditText
android:id="@+id/gt"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_gravity="center"
android:layout_marginTop="10dp"
android:padding="6dp"
android:background="@color/white_transparent50p"/>
/>
<EditText
android:id="@+id/erergeargf"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_gravity="center"
android:layout_marginTop="10dp"
android:padding="6dp"
android:background="@color/white_transparent50p"/>
<View
android:id="@+id/a"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_margin="5dp"
android:layout_gravity="center"></View>
<View
android:id="@+id/b"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_margin="5dp"
android:layout_gravity="center"></View>
</LinearLayout>
</ScrollView>
</FrameLayout>
activity_main xml Layout sieht wie folgt aus:
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context="dk.minreklame.minetilbud_v2.MainActivity">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
/>
</android.support.design.widget.AppBarLayout>
<com.bluelinelabs.conductor.ChangeHandlerFrameLayout
android:id="@+id/controller_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
/>
</android.support.design.widget.CoordinatorLayout>
Wenn Informationen fehlen, wenden Sie sich bitte und ich werde es posten.
Jede Hilfe wird sehr geschätzt.
Thanka al ot für Ihre Antwort .. Allerdings bekomme ich nicht, warum eingegebenen Werte der EditText der nach der Rotation beibehalten werden, wenn ich diese nicht überall angegeben haben .. Als ich das herausgefunden haben, ich habe gerade Sie müssen entscheiden, ob Sie eine Lösung suchen, die auf die Wiederherstellung von Zuständen über onSaveViewState und onRestoreViewState oder die Einstellung von android: configChanges = "orientation ..." im Manifest zurückgreift. Wenn Sie damit Erfahrung haben, würde ich gerne hören, was Sie empfehlen würden. Dank – Langkiller
Dirigent automatisch speichert und stellt Ihren Ansichtszustand für Sie wieder her. Alles, was ein Widget in seiner internen 'onSaveInstanceState'-Methode speichert, wird gespeichert und wiederhergestellt. Wie das funktioniert, hängt von den Widgets ab, die Sie verwenden. – EricKuck
Also EditText Eingabedaten werden immer auf rotate wiederhergestellt werden, aber Hintergrundfarbe wird nicht? Und es spielt keine Rolle, ob RETAIN_DETACH gesetzt ist oder nicht? Für mich ist das nicht das logischste Verhalten. Wie auch immer, danke für die Antwort. Ich werde es natürlich akzeptieren :) – Langkiller