現在、Android用の指揮者フレームワークについて学習していますが、それはどのように動作するのかについての問題や誤解があります。Androidの指揮者:オリエンテーション変更のビューの状態を保持する方法
Iは方法
setRetainViewMode(RetainViewMode.RETAIN_DETACH)という印象の下にありました。
は、コントローラのビューの状態を保存します。その動作をテストするために、EditTextビューを追加し、その中に値を入力して画面を回転させました。また、onclickリスナーを添付して2つのビューを追加し、背景色をonclickに変更しました。
EditTextビューは状態を維持し、入力された値を保持していました。しかし、2つのビューは元の背景色(none)に戻りました。
これは私がこの単純なMainActivity(注:私はKotlinに書いている):持ってRetainViewModeが
に設定されているにかかわらず、ビューの動作です
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>
任意の情報が欠落している場合は、尋ねると、私はそれを掲載する予定ください。
ご協力いただきますようお願い申し上げます。
あなたの答えのためのThankaアルOTは.. .. 私はこれを考え出した、私はちょうどonSaveViewStateとonRestoreViewStateを使って状態を復元するか、マニフェストにandroid:configChanges = "orientation ..."を設定することで解決する方法を決定する必要があります。この経験があれば、本当にお勧めしたいことをお聞きしたいと思います。おかげで – Langkiller
指揮者は自動的にあなたのビューの状態を保存して復元します。ウィジェットが内部の 'onSaveInstanceState'メソッドに保存するものはすべて保存され、復元されます。その仕組みは、使用しているウィジェットによって異なります。 – EricKuck
EditTextの入力データは回転すると常に復元されますが、背景色は復元されません。 RETAIN_DETACHが設定されているかどうかは関係ありませんか?私にとってこれは最も論理的な行動ではありません。とにかく、答えをありがとう。私はもちろんそれを受け入れるだろう:) – Langkiller