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

标签 java android

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

相关文章:

java - Maven 在 Eclipse 上看不到编译器

java - 如何开发显示序列的递归函数?

java - 无法停止我的俄罗斯方 block 游戏中的棋子(Java swing)

Android Observables.zip 列出可观察对象

java - 如何使用 Android 代码中的 GCM CCS 进行上游消息服务?

java - 无法检索 Java 线程来停止它

java - WindowBuilder GUI,在哪里创建主要方法和对象?

android - 适用于 Android 的 Google+ 平台 - NoClassDefFoundError : com. google.android.gms.samples.plus.SignInActivity

java - Android 程序启动时崩溃

android - 我可以观察 Android 应用程序进程优先级的变化吗?