2017-07-16 3 views
3

データバインディングを使用してBottomNavigationViewのリスナーをクリックします。私はそれはセッターの間違った名前によって引き起こされると考えXML属性を関連付けるために使用は、私はデータバインディングライブラリを使用して、ツールバーのタイトルを変更したい

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 **** 

:すべては私がエラーを持っている、すなわちをBottomNavigationViewのリスナーを除いて正常に動作します。 XMLでBottomNavigationViewはapp:onNavigationItemSelectedを持っていますが、BottomNavigationViewのセッターはsetOnNavigationItemSelectedListener、ないsetOnNavigationItemSelectedです。私は右だ場合は、解決策はAndroid documentationです。しかし、私はこの注釈をどこに置くべきですか?どのクラスに?

つまり、ViewModelでBottomNavigationViewのクリックを制御できるようにするにはどうすればよいですか?ここで

はファイルです:ActivityMainViewModel.java

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); 
    } 
} 

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> 

d oはカスタムビューを作成することです(:warning: Application namespace for attribute app:onNavigationItemSelected will be ignored.アプリの実行を、それは、ツールバーのタイトルを変更し、警告を与えていません):

@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; 
    } 
} 

答えて

2

は、これであなたのNavigationItemViewBindingクラスを交換し、それが動作します:

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

リスナーを組み込むカスタムセッターを使用したいと考えています。リスナーを設定するメソッドの名前を変更するよりももう少し作業が必要です。

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

+0

ありがとうございます!できます –

関連する問題