搜索栏数据绑定错误

时间:2018-08-29 15:11:57

标签: android seekbar android-databinding

编译时出现以下错误:

BindingAdapter onOpacityValueChanged(android.widget.SeekBar,int,boolean): old values should be followed by new values. Parameter 2 must be the same type as parameter 3.
public  void onOpacityValueChanged(SeekBar seekBar,  int newOpacity,  boolean fromUser) {
             ^

XML代码是:

<SeekBar
        android:id="@+id/soaring_forecast_seekbar_opacity"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:max="100"
        android:min="0"
        android:onProgressChanged="@{forecastDisplay::onOpacityValueChanged}"
        android:visibility="visible"
        app:layout_constraintEnd_toEndOf="@+id/soaring_forecast_constraint_layout"
        app:layout_constraintStart_toStartOf="@+id/soaring_forecast_constraint_layout"
        app:layout_constraintTop_toBottomOf="@+id/soaring_forecast_image_time"/>

,源代码为:

@BindingAdapter(value={"android:onProgressChanged"})
public void onOpacityValueChanged(SeekBar seekBar,  int newOpacity,  boolean fromUser) {
    forecastOverlayOpacity = newOpacity;
    appPreferences.setForecastOverlayOpacity(newOpacity);
    stopImageAnimation();
    displayForecastImageSet();
}

从我可以看到的代码与SeekBarBindingAdapter onProgressChanged匹配。我想念什么?

3 个答案:

答案 0 :(得分:1)

  

从我可以看到的代码匹配到SeekBarBindingAdapter   onProgressChanged。我想念什么?

OR

  • 您可以在Android Studio库中看到。

image

  

BindingAdapter   onOpacityValueChanged(android.widget.SeekBar,int,boolean):旧值   应该跟随新的值。参数2必须与以下类型相同   参数3. public void onOpacityValueChanged(SeekBar seekBar,int   newOpacity,布尔值fromUser){                ^

@BindingAdapter方法必须是静态的。

最重要

您遵循的方式不正确。 @BindingAdapter用于需要一些自定义实现的地方。参见documentation

因此从您的方法中删除@BindingAdapter(value={"android:onProgressChanged"})

或者您可以通过使用lambda表达式使您的方法更加简单。

public void onOpacityValueChanged(int newOpacity) {
//something
}

android:onProgressChanged="@{(sb, value, fromUser)->forecastDisplay.onOpacityValueChanged(newValue)}"

答案 1 :(得分:0)

我看到我把这个复杂化了。我不需要// @ BindingAdapter(value = {“ android:onProgressChanged”})

有效的是:

//@BindingAdapter(value={"android:onProgressChanged"})  <- Don't need.
public void onOpacityValueChanged(SeekBar seekBar, int newOpacity, boolean fromUser) {
    forecastOverlayOpacity = newOpacity;
    appPreferences.setForecastOverlayOpacity(newOpacity);
    stopImageAnimation();
    displayForecastImageSet();
}

答案 2 :(得分:-1)

将搜索栏声明为全局

SeekBar myseekBar;

在OnCreateView中:

myseekBar =  findViewById(R.id.myseekBar);
myseekBar.setProgress(1);
myseekBar.setMax(10);
myseekBar.incrementProgressBy(1);

它将搜索栏划分为10点标度,每个点标为1点标度。

myseekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener()
{
    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
    {
       // get progress here
    }
    @Override
    public void onStartTrackingTouch(SeekBar seekBar) { }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) { }
});

来自xml:

<SeekBar
    android:id="@+id/myseekBar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:progressBackgroundTint="@color/SplashScreen"
    android:progressTint="@color/BlueText"
    android:layout_marginBottom="20dp" />

这是显示,启动搜索栏以及通过xml和代码对其进行访问的方式

希望有帮助