双向绑定Android

时间:2017-05-26 12:20:23

标签: java 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”,而不是我在应用程序运行时输入的新文本。

我错过了什么?

1 个答案:

答案 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}}片段()。