2017-03-19 21 views
0

データバインディングを機能させようとしていますが、これまで成功していません。ObservableBooleanデータバインディングは設定時にビューを更新しません

マイMainActivity.javaはこれを含んでいます

public ActivityMainBinding binding; 
private Button createPartyButton; 
public final ObservableBoolean partyIsCreated = new ObservableBoolean(false); 

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

binding = DataBindingUtil.setContentView(this, R.layout.activity_main); 

createPartyButton = (Button) findViewById(R.id.create_party_button); 
createPartyButton.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View v) { 
    partyIsCreated.set(!partyIsCreated.get()); 
    } 
}); 
} 

マイactivity_main.xmlはこれです:アンドロイドセクションで

<layout> 
    <data> 
    <variable 
     name="main" 
     type="com.example.MainActivity"/> 
    </data> 
    <LinearLayout 
    android:id="@+id/container" 
    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:orientation="vertical" 
    tools:context="com.example.MainActivity"> 

    <EditText android:id="@+id/my_nickname_text" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:enabled="@{main.partyIsCreated ? true : false}"/> 

    <Button android:id="@+id/create_party_button" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@string/create_party_button_text"/> 
    </LinearLayout> 
</layout> 

私のbuild.gradleはこれを含んでいます

dataBinding { 
    enabled = true 
} 

休憩ビルドの設定はこれです:

compileSdkVersion 25 
buildToolsVersion "25.0.2" 
gradle:2.3.0 

データバインディングが自動生成されていることがわかります。しかし、何も見えません。データバインディングが機能しなくなったのは何ですか?

答えて

2

問題は、変数を設定していないということです。

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

    binding = DataBindingUtil.setContentView(this, R.layout.activity_main); 
    binding.setMain(this); 
} 

しかし、それが唯一の問題ではありません。まず、findViewById()を使用していますが、これはデータバインディングではまったく必要ありません。 ID create_party_buttonのビューにアクセスするには、バインディングのパブリックフィールド「binding.createPartyButton」を参照します。

さらに、アクセスする必要はありません。あなたがやっているように私は必ずしもビューモデルやコントローラとしての活動そのものを使用して助言するものではありませんが、あなたは行う場合:

public class MainActivity extends Activity { 
    private ActivityMainBinding binding; 
    public final ObservableBoolean partyIsCreated = new ObservableBoolean(false); 

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

     binding = DataBindingUtil.setContentView(this, R.layout.activity_main); 
     binding.setMain(this); 
    } 

    public void partyClicked() { 
     partyIsCreated.set(!partyIsCreated.get()); 
    } 
} 

そして、あなたは、レイアウト自体にクリックハンドラを設定します。

<Button android:id="@+id/create_party_button" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/create_party_button_text" 
     android:onClick="@{() -> main.partyClicked()}/> 
+0

ありがとう! binding.setMain(this);私の場合を解決した – user2010496

関連する問題