gpt4 book ai didi

java - 两种方式绑定(bind)Android

转载 作者:行者123 更新时间:2023-12-02 13:04:47 25 4
gpt4 key购买 nike

也许我在这里遗漏了一些小东西,但我无法让我的绑定(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com