ObservableBoolean 数据绑定在设置时不更新视图

ObservableBoolean databinding does not update view when set

我正在尝试让数据绑定工作,但到目前为止没有成功。

我的 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>

我在 android 部分的 build.gradle 包含:

 dataBinding {
    enabled = true
}

其余的构建设置是这样的:

compileSdkVersion 25
buildToolsVersion "25.0.2"
gradle:2.3.0

我可以看到数据绑定是自动生成的。但是视图中没有任何反应。我错过了什么让数据绑定工作?

问题是您没有设置变量:

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

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

但这不是唯一的问题。首先,您正在使用 findViewById(),这对于数据绑定来说是完全不必要的。您可以通过引用绑定中的 public 字段来访问 ID 为 create_party_button 的视图:binding.createPartyButton.

更重要的是,您根本不需要访问它。我不一定建议像您一样使用 Activity 本身作为视图模型或控制器,但如果您这样做:

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()}/>