我试图让数据绑定工作,但到目前为止还没有成功。
我的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
我可以看到数据绑定已自动生成。但是视图中没有任何反应。我错过了什么让数据绑定工作?
答案 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()}/>