2017-06-22 10 views
0

現在、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> 

任意の情報が欠落している場合は、尋ねると、私はそれを掲載する予定ください。

ご協力いただきますようお願い申し上げます。

答えて

1

ビューにはホストアクティビティへの参照が含まれているため、それらは方向変更を超えて保持されることはありません。それはメモリリークを引き起こすでしょう。

コントローラーは、デタッチしたときにそのビューへの参照を保持しますが、構成の変更が発生した場合でも参照を解放します。私はこのどこかを指定していないときのEditTextのを入力した値は、回転後に保存されている理由が、私は得ることはありません

+0

あなたの答えのためのThankaアルOTは.. .. 私はこれを考え出した、私はちょうどonSaveViewStateとonRestoreViewStateを使って状態を復元するか、マニフェストにandroid:configChanges = "orientation ..."を設定することで解決する方法を決定する必要があります。この経験があれば、本当にお勧めしたいことをお聞きしたいと思います。おかげで – Langkiller

+0

指揮者は自動的にあなたのビューの状態を保存して復元します。ウィジェットが内部の 'onSaveInstanceState'メソッドに保存するものはすべて保存され、復元されます。その仕組みは、使用しているウィジェットによって異なります。 – EricKuck

+0

EditTextの入力データは回転すると常に復元されますが、背景色は復元されません。 RETAIN_DETACHが設定されているかどうかは関係ありませんか?私にとってこれは最も論理的な行動ではありません。とにかく、答えをありがとう。私はもちろんそれを受け入れるだろう:) – Langkiller

関連する問題