ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

android – 使用数据绑定添加BottomNavigationView的单击侦听器

2019-05-22 21:26:00  阅读:383  来源: 互联网

标签:android data-binding android-databinding


我想使用数据绑定库更改工具栏标题.一切正常,除了BottomNavigationView的监听器,即我有一个错误:

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:compileDebugJavaWithJavac'.
> java.lang.RuntimeException: Found data binding errors.
****/ data binding error ****msg:Could not resolve viewmodel::onNavigationClick as a listener.
file:D:\Replacements\app\src\main\res\layout\activity_main.xml
loc:85:40 - 85:67
****\ data binding error ****

我认为这是由用于关联xml属性的setter的错误名称引起的.在xml中,BottomNavigationView有app:onNavigationItemSelected,但是BottomNavigationView的setter是setOnNavigationItemSelectedListener,而不是setOnNavigationItemSelected.如果我是对的,解决方案是在Android documentation.但是我应该在哪里放这个注释?在哪个级别?

换句话说,我应该怎么做才能在ViewModel中使用代码来控制BottomNavigationView上的点击?

这是文件:

ActivityMain.java

public class ActivityMain extends AppCompatActivity {

    private ActivityMainViewModel viewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Initiating ViewModel to Activity
        viewModel = ViewModelProviders.of(this).get(ActivityMainViewModel.class);

        // Initiating ContentView in Activity
        setContentView(R.layout.activity_main);

        // Initiating DataBinding for ContentView in Activity
        ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        binding.setViewmodel(viewModel);
    }
}

ActivityMainViewModel.java

public class ActivityMainViewModel extends ViewModel {

    private MutableLiveData<String> toolbarTitle = new MutableLiveData<>();

    public String getToolbarTitle() {
        return toolbarTitle.getValue();
    }

    public void setToolbarTitle(String toolbarTitle) {
        this.toolbarTitle.setValue(toolbarTitle);
    }

    public boolean onNavigationClick(@NonNull MenuItem item) {
        switch (item.getItemId()) {
            case R.id.navigation_1:
                setToolbarTitle("title 1");
                return true;
            case R.id.navigation_2:
                setToolbarTitle("title 2");
                return true;
            case R.id.navigation_3:
                setToolbarTitle("title 3");
                return true;
        }
        return false;
    }
}

activity_main.xml中

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

<data>
    <variable name="viewmodel" type="com.example.example.viewmodel.ActivityMainViewModel"/>
</data>

<android.support.constraint.ConstraintLayout
    ...>

    <android.support.design.widget.AppBarLayout
        ...>

        <android.support.v7.widget.Toolbar
            android:id="@+id/main_toolbar"
            android:title="@{viewmodel.toolbarTitle}"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="@color/new_blue_light"
            android:minHeight="?attr/actionBarSize"
            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

    </android.support.design.widget.AppBarLayout>

    <FrameLayout
        ...>
        ...
    </FrameLayout>

    <android.support.design.widget.BottomNavigationView
        android:id="@+id/navigation"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:background="?android:attr/windowBackground"
        app:itemIconTint="@drawable/navigation_color_state"
        app:itemTextColor="@drawable/navigation_color_state"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:menu="@menu/navigation"
        app:onNavigationItemSelected="@{viewmodel::onNavigationClick}"
        tools:layout_constraintBottom_creator="0"
        tools:layout_constraintLeft_creator="0"
        tools:layout_constraintRight_creator="0" />

</android.support.constraint.ConstraintLayout>

</layout>

唯一的,我尝试做的是创建自定义视图(应用程序运行,但它不会更改工具栏标题并发出警告:警告:属性应用程序的应用程序命名空间:onNavigationItemSelected将被忽略.):

@BindingMethods({
        @BindingMethod(
                type = BottomNavigationViewBinding.class,
                attribute = "app:onNavigationItemSelected",
                method = "setOnNavigationItemSelectedListener"
        ),
})
public class BottomNavigationViewBinding extends BottomNavigationView{

    private OnNavigationItemSelectedListener mSelectedListener;

    public BottomNavigationViewBinding(Context context) {
        this(context, null);
    }

    public BottomNavigationViewBinding(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public BottomNavigationViewBinding(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public interface OnNavigationItemSelectedListener {
        boolean onNavigationItemSelected(MenuItem item);
    }

    public void setOnNavigationItemSelectedListener(@Nullable OnNavigationItemSelectedListener listener) {
        mSelectedListener = listener;
    }
}

解决方法:

用这个替换你的NavigationItemViewBinding类,它将工作:

public class BottomNavigationViewBindingAdapter {
    @BindingAdapter("onNavigationItemSelected")
    public static void setOnNavigationItemSelectedListener(
            BottomNavigationView view, OnNavigationItemSelectedListener listener) {
        view.setOnNavigationItemSelectedListener(listener);
    }
}

这个想法是你想使用自定义setter来合并监听器,这比重命名设置监听器的方法需要更多的工作.

https://developer.android.com/topic/libraries/data-binding/index.html#custom_setters

标签:android,data-binding,android-databinding
来源: https://codeday.me/bug/20190522/1153911.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有