2016-07-19 7 views
6

私はAndroidのデータバインディング機能について読んでいました。私はネストされたレイアウトからビューをバインドしようとしていました。私の活動は、アンドロイドのデフォルトテンプレートDrawerMenuActivityで、レイアウト内にネストされたcontent_my_activityレイアウトです。入れ子になったレイアウトでAndroid DataBindingを設定する方法

私は3つの自動生成バインディングクラスを持っています。 MyActivityBinding,AppBarMyActivityBindingおよびContentMyActivityBinding

MyActivity.java

MyActivityBinding activityBinding; 
AppBarMyActivityBinding appBarBinding; 
ContentMyActivityBinding contentBinding; 

protected void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 

    activityBinding = DataBindingUtils.setContentView(this, 
           R.layout.activity_my_activity); 
    appBarBinding = DataBindingUtils.setContentView(this, 
           R.layout.app_bar_my_activity); 
    contentBinding = DataBindingUtils.setContentView(this, 
           R.layout.content_my_activity); 

    setName(); 
} 

private void setName(){ 
    contentBinding.setFirstName("Omkar"); 
} 

しかし、それは以下のようにRuntimeExceptionをスロー:

E/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.example, PID: 18305 
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example/com.example.userInterface.activity.MyActivity}: android.view.InflateException: Binary XML file line #35: Binary XML file line #27: Error inflating class fragment 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2426) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2490) 
    at android.app.ActivityThread.access$900(ActivityThread.java:154) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1354) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:148) 
    at android.app.ActivityThread.main(ActivityThread.java:5443) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
Caused by: android.view.InflateException: Binary XML file line #35: Binary XML file line #27: Error inflating class fragment 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:539) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:423) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:374) 
    at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:280) 
    at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:140) 
    at android.databinding.DataBindingUtil.setContentView(DataBindingUtil.java:276) 
    at com.example.userInterface.activity.MyActivity.onCreate(MyActivity.java:88) 
    at android.app.Activity.performCreate(Activity.java:6259) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1130) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2379) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2490)  
    at android.app.ActivityThread.access$900(ActivityThread.java:154)  
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1354)  
    at android.os.Handler.dispatchMessage(Handler.java:102)  
    at android.os.Looper.loop(Looper.java:148)  
    at android.app.ActivityThread.main(ActivityThread.java:5443)  
    at java.lang.reflect.Method.invoke(Native Method)  
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)  
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)  
Caused by: android.view.InflateException: Binary XML file line #27: Error inflating class fragment 
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:782) 
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704) 
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:835) 
    at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798) 
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:838) 
    at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798) 
    at android.view.LayoutInflater.parseInclude(LayoutInflater.java:971) 
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:831) 
    at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:515) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:423)  
    at android.view.LayoutInflater.inflate(LayoutInflater.java:374)  
    at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:280)  
    at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:140)  
    at android.databinding.DataBindingUtil.setContentView(DataBindingUtil.java:276)  
    at com.example.userInterface.activity.MyActivity.onCreate(MyActivity.java:88)  
    at android.app.Activity.performCreate(Activity.java:6259)  
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1130)  
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2379)  
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2490)  
    at android.app.ActivityThread.access$900(ActivityThread.java:154)  
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1354)  
    at android.os.Handler.dispatchMessage(Handler.java:102)  
    at android.os.Looper.loop(Looper.java:148)  
    at android.app.ActivityThread.main(ActivityThread.java:5443)  
    at java.lang.reflect.Method.invoke(Native Method)  
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)  
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)  
Caused by: java.lang.IllegalArgumentException: Binary XML file line #27: Duplicate id 0x7f0e0081, tag null, or parent id 0xffffffff with another fragment for com.google.android.gms.maps.SupportMapFragment 
    at android.support.v4.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2416) 
    at android.support.v4.app.FragmentController.onCreateView(FragmentController.java:120) 
    at android.support.v4.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:374) 
    at android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(BaseFragmentActivityHoneycomb.java:33) 
    at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:75) 
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:754) 
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)  
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:835)  
    at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798)  
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:838)  
    at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798)  
    at android.view.LayoutInflater.parseInclude(LayoutInflater.java:971)  
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:831)  
    at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798)  
    at android.view.LayoutInflater.inflate(LayoutInflater.java:515)  
    at android.view.LayoutInflater.inflate(LayoutInflater.java:423)  
    at android.view.LayoutInflater.inflate(LayoutInflater.java:374)  
    at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:280)  
    at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:140)  
    at android.databinding.DataBindingUtil.setContentView(DataBindingUtil.java:276)  
    at com.example.userInterface.activity.MyActivity.onCreate(MyActivity.java:88)  
    at android.app.Activity.performCreate(Activity.java:6259)  
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1130)  
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2379)  
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2490)  
    at android.app.ActivityThread.access$900(ActivityThread.java:154)  
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1354)  
    at android.os.Handler.dispatchMessage(Handler.java:102)  
    at android.os.Looper.loop(Looper.java:148)  
    at android.app.ActivityThread.main(ActivityThread.java:5443)  
    at java.lang.reflect.Method.invoke(Native Method)  
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)  
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)  

どのように私はcontent_my_activityからビューを結合しない

は、私は以下のように、すべての3クラスを初期化しようとしましたMyActivity.javaクラスでは、どんな助けにも感謝しています。

ありがとうございました。

+0

[こちら](https://github.com/kevalpatel2106/data-binding-demo/tree/master/app/src/main)に従うことができます。これは理解するのに役立つかもしれません。 –

答えて

8

DataBindingUtils.setContentView()これは、現在のビューを指定されたパラメータに設定します。私はあなたが全体のビューとしてあなたのAppBarをしたいとは思わないか?

しかし、私はlayout_activity_main.xmlにあなたのレイアウトがincludeと仮定します。 George Mountはこの機能についての投稿をwhole blogと書いています。コード例はこの記事のものです。

最初の例はlayout_activity_main.xml(または名前を付けました)です。AppBarContentなどが含まれています。

hello_world.xml 
<layout xmlns:android="http://schemas.android.com/apk/res/android"> 
    <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:orientation="vertical"> 

     <TextView 
       android:id="@+id/hello" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content"/> 
     <include 
       android:id="@+id/world1" 
       layout="@layout/included_layout"/> 
     <include 
       android:id="@+id/world2" 
       layout="@layout/included_layout"/> 
    </LinearLayout> 
</layout> 


included_layout.xml 
<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:android="http://schemas.android.com/apk/res/android"> 
    <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/world"/> 
</layout> 

今使用レイアウトが明確であることを、あなたはあなたのActivityMainにジャンプする必要があります、DataBindingを初期化し、あなたのフィールドにアクセス:

//This works if you have used a variable in your <data> tag and you have built your project afterwards, if you don't have an activity 
HelloWorldBinding binding = HelloWorldBinding.inflate(getLayoutInflater()); 

//if you have an activity, you can use setContentView from the DataBindingUtils. Don't forget to delete the generic setContentView 
HelloWorldBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_my_activity); 


//Once you have accomplished the above, you can access your data-bound fields like this: 
binding.hello.setText(“Hello”); 
binding.world1.world.setText(“First World”); 
binding.world2.world.setText(“Second World”); 

あなたの<include>タグにIdsを設定することが重要です私にあなたのActivityを正しくアクセスしてください。

+0

素晴らしい!したがって、3層のネストされたレイアウトであっても、この 'binding.world1.world2.world.setText(" Third World ")のように単純にアクセスすることができます。非アクティブの場合にはinflaterを渡し、外側の場合は' setContentView'を初期化しますほとんどのレイアウトバインディングクラス? – Omkar

+0

はい、これは動作します。 :) – yennsarah

+1

この入れ子構造を設定した後、Androidスタジオをきれいにして再起動してください。 Androidスタジオは、私がこれらのことをするまで、入れ子を認識しませんでした。 – Justin

関連する問題