为什么我的绑定按钮本身没有按下?

时间:2017-01-22 19:33:28

标签: android android-databinding pressed

我做了一个按钮,将它的pressed状态绑定到一些可观察的状态。

在下面的示例中,可观察性是不变的。

尽管如此,此按钮在一段时间后或应用程序切换

后仍未按下

enter image description here

活动代码如下:

public class TryResearchButtonUnpress extends AppCompatActivity {

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

        //setContentView(R.layout.activity_try_research_button_unpress);
        ActivityTryResearchButtonUnpressBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_try_research_button_unpress);
        binding.setActivity(this);
    }

    public final ObservableBoolean pressed = new ObservableBoolean(true);
}

布局代码如下

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

    <data>
        <variable name="activity" type="com.inthemoon.tryresearchbuttonunpress.TryResearchButtonUnpress"/>
    </data>

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

        android:id="@+id/activity_try_research_button_unpress"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:gravity="center">

        <ImageButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@null"
            android:pressed="@{activity.pressed}"
            android:src="@drawable/record_selector"
            />
    </RelativeLayout>
</layout>

资源和完整代码在GitHub中:https://github.com/dims12/TryResearchButtonUnpress

我怀疑这是因为我将值绑定到视图本身。这没有描述,但我自己冒了风险。

更新

我把observable放到了单独的类中,但是按钮仍然没有压缩。

请参阅github commit 690fbee

更新2

我无法设置&#34;双向绑定&#34;使用以下代码

<ImageButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@null"
            android:pressed="@={model.pressed}"
            android:src="@drawable/record_selector"
            />

由于以下错误

  

错误:(8,58)错误:包   com.inthemoon.tryresearchbuttonunpress.databinding不存在   错误:任务&#39;:app:compileDebugJavaWithJavac&#39;执行失败。

     
    

java.lang.RuntimeException:发现数据绑定错误。     **** /数据绑定错误****消息:找不到属性的getter&#39; android:press&#39;值类型为boolean on     android.widget.ImageButton。     文件:d:\用户\变暗\设计\ TryResearchButtonUnpress \程序\ SRC \主\水库\布局\ activity_try_research_button_unpress.xml     当前:18:8-24:13     **** \数据绑定错误****

  

2 个答案:

答案 0 :(得分:0)

按钮 - 这是UI组件,提供反馈。我认为您需要创建two-way databinding来重现和存储按下(未按下)状态。即。

<ImageButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@null"

    android:pressed="@={activity.pressed}"

    android:src="@drawable/record_selector"/>

接下来,您需要从视图实现@InverseBindingAdapter反向绑定:

@InverseBindingAdapter(attribute = "android:pressed")
public static boolean getPressedState(ImageButton button){
    return button.isPressed();
}

此外,您需要使用onSaveInstanceState() menhod的覆盖来保存按钮状态,并在覆盖onRestoreInstanceState()时恢复它。

答案 1 :(得分:-1)

我不确定twoway绑定是否有效,因为我从未使用它(尝试但从未工作过) 所以解决方法是

<Button
      ...
      android:onClick="@{activity.onClicked}"/>

以及活动(作为ViewModel工作)

有一个方法

public void onCliked(Button view){
   // update datamodel pressed state
   model.setPressed(view.isPressed());
}

//免责声明..这只是伪代码,这个想法就是这个