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

时间:2017-03-19 13:33:37

标签: java android android-gradle android-databinding

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

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

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

1 个答案:

答案 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

更重要的是,您根本不需要访问它。我不一定建议您将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()}/>