也许我在这里错过了一些小事,但我无法让我的约束力发挥作用。我将其设置如下:
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(); }
}
在我的片段中,我将绑定设置如下,所有都在layout
标记内:
<data>
<variable
name="modelData"
type="Common.CommonObjects.ToolbarBind"/>
</data>
对于绑定到属性:
<EditText
android:layout_width="match_parent"
android:layout_height="match_parent"
android:hint="Search"
android:text="@={modelData.searchedText}"/>
可以看出,在onCreate
我将文本设置为“Hello”,但即使手机上显示视图,EditText也不会填充此文本。当我更改值并单击我的按钮时,我在事件中返回的值是“Hello”,而不是我在应用程序运行时输入的新文本。
我错过了什么?
答案 0 :(得分:1)
您的代码存在的问题是,您将Activity
的内容视图设置为onCreate(...)
中的内容,但是您在onCreateView(...)
中使用不同的内容作为片段&# 39; s视图,它获取模型数据(不是您在onCreate(...)
中创建的另一个)。我不确切地知道你想要达到的目标,但我猜你不想将Activity
的内容视图更改为片段中的某些内容,所以我只是告诉你你可以使用的变种,但是,你应该把它变成你喜欢的任何东西。
完全删除onCreate(...)
,然后仅使用onCreateView(...)
使用数据绑定来扩充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(...)
{1}}片段(不)。