Android-проводник: как сохранить состояние просмотров изменений ориентации

В настоящее время я изучаю концепцию проводника для Android и имею немного проблемы или непонимание того, как это работает.

У меня создалось впечатление, что метод

setRetainViewMode (RetainViewMode.RETAIN_DETACH);

сохранит состояния представлений в контроллере. Чтобы проверить поведение, я добавил EditText-представления, ввел в него значение и повернул экран. Я также добавил 2 просмотра с включенными прослушивателями onclick, изменив цвет фона onclick

Результатом теста было то, что представления EditText поддерживали состояние и сохраняли введенные значения. Но 2 взгляда изменились на исходный цвет фона (нет).

Это поведение представлений, независимо от которых установлен RetainViewMode

У меня есть эта простая MainActivity (примечание: я пишу в Kotlin):

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) } } } 

И вот 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) } } 

И файл макета xml 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> 

layout_main xml выглядит следующим образом:

 <?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> 

Если какая-либо информация отсутствует, обратитесь, и я отправлю ее.

Любая помощь будет оценена.

    Поскольку ваши взгляды имеют ссылки на активность хоста, они никогда не будут сохранены в результате изменений ориентации. Это вызовет утечку памяти. Документы в состоянии RETAIN_DETACH:

    Контроллер сохранит свою ссылку на свой вид при отсоединении, но все равно освободит ссылку при изменении конфигурации.

    Intereting Posts