2017-06-22 1 views
0

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.

Antwort

1

Da Ihre Ansichten Verweise auf die Host-Aktivität haben, werden sie bei Richtungsänderungen nie beibehalten. Das würde zu einem Speicherverlust führen. Die Dokumentation im Status RETAIN_DETACH:

Der Controller behält seinen Bezug zu seiner Ansicht bei, wenn er losgelöst wird, gibt jedoch die Referenz bei einer Konfigurationsänderung frei.

+0

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

+0

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

+0

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

Verwandte Themen