Android指挥:如何保留定位变化的观点
我目前正在学习Android的Conductor框架,并且对它的工作原理有一些问题或误解。
我当时的印象是这个方法
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>
activity_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状态下的文档:
控制器将在分离时保留对其视图的引用,但在发生配置更改时仍将释放引用。