也许我在这里遗漏了一些小东西,但我无法让我的绑定(bind)工作。我设置如下:
public class Toolbar extends Fragment {
//Interaction handlers
//interface for interaction with Activity
public interface ToolBarInteraction{
public void Search(String screenName);
}
private ToolbarBind modelData;
private ToolBarInteraction mListener;
public static Toolbar newInstance() {
return new Toolbar();
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FragmentToolbarBinding binding = DataBindingUtil.setContentView(getActivity(), R.layout.fragment_toolbar);
modelData = ToolbarBind.newInstance();
modelData.searchedText.set("Hello");
binding.setModelData(modelData);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
checkMListener();
View view = inflater.inflate(R.layout.fragment_toolbar, container, false);
//get button to set onClick event
Button button = (Button)view.findViewById(R.id.btnSearch);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String hello = modelData.searchedText.get();
}
});
return view;
}
public void OnSearchClicked(View view){
mListener.Search(modelData.searchedText.get());
}
private void checkMListener(){
try{
mListener = (ToolBarInteraction) getActivity();
} catch (ClassCastException ex) {
throw new ClassCastException(getActivity().toString()
+ " must implement the ToolBarInteraction Interface");
}
}
}
这是 ToolbarBind 的代码:
public class ToolbarBind extends BaseObservable {
private String _searchText;
public final ObservableField<String> searchedText = new ObservableField<String>();
//factory method
public static ToolbarBind newInstance(){ return new ToolbarBind(); }
}
在我的 fragment 中,我将绑定(bind)设置如下,全部在 layout
标记内:
<data>
<variable
name="modelData"
type="Common.CommonObjects.ToolbarBind"/>
</data>
对于绑定(bind)到属性:
<EditText
android:layout_width="match_parent"
android:layout_height="match_parent"
android:hint="Search"
android:text="@={modelData.searchedText}"/>
可以看出,在 onCreate
中,我将文本设置为“Hello”,但即使 View 显示在手机上,EditText 也不会填充此文本。当我更改值并单击按钮时,我在事件中返回的值是“Hello”,而不是应用程序运行时输入的新文本。
我错过了什么?
最佳答案
您的代码的问题在于您将 Activity
的内容 View 设置为 onCreate(...)
中的内容,但您在 onCreate(...)
中膨胀并使用了不同的内容 onCreateView(...)
作为 fragment 的 View ,它获取模型数据(而不是您在 onCreate(...)
中创建的另一个数据)。我不知道你到底想要实现什么,但我猜你不想将 Activity
的内容 View 更改为 fragment 中的内容,所以我只是将向您展示您可以使用的变体,但是,您应该将其更改为您喜欢的任何内容。
完全删除 onCreate(...)
,然后仅使用 onCreateView(...)
通过数据绑定(bind)来膨胀 fragment_toolbar
布局:
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
checkMListener();
FragmentToolbarBinding binding = DataBindingUtil.inflate(inflater, R.layout.fragment_toolbar, container, false);
// FIXME you're losing data here; watch out: checking whether savedInstanceState == null is not enough because returning from backstack it will be null
modelData = ToolbarBind.newInstance();
// FIXME modify this so it sets the data from savedInstanceState when configuration changes
modelData.searchedText.set("Hello");
binding.setModelData(modelData);
//get button to set onClick event
binding.btnSearch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String hello = modelData.searchedText.get();
}
});
return binding.getRoot();
}
注意 FIXME
部分。您可以将modelData
init移至onCreate(...)
,这会将其从backstack-return事物中保存下来,但是,配置更改将仍然调用 onCreate(...)
除非您在 fragment 上调用 setRetainInstance(true)
(不要)。
关于java - 两种方式绑定(bind)Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44201476/