[英]Two way binding Android
也許我在這里缺少一些小東西,但是我無法束縛工作。 我將其設置如下:
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”,而不是應用程序運行時輸入的新文本。
我想念什么?
代碼的問題是,您將Activity
的內容視圖設置為onCreate(...)
某個內容,但在onCreateView(...)
中將其充氣並使用其他內容作為片段的視圖,從而獲取模型數據(而不是您在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(...)
,以將其從后退返回中保存,但是,除非對片段調用setRetainInstance(true)
,否則配置更改仍將調用onCreate(...)
( 不要 )。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.