gpt4 book ai didi

java - 如何通过数据绑定(bind)更新布局元素的可见性

转载 作者:行者123 更新时间:2023-12-01 09:17:20 25 4
gpt4 key购买 nike

我很难理解如何使用数据绑定(bind)更新 View 。我正在尝试一个简单的示例,其中切换开关将使按钮在 View 中出现/消失。

预期行为:
切换按钮应打开/关闭“添加 key ”按钮(即 VISIBLEGONE)。

实际行为:
“添加 key ”按钮的可见性不会更新。它仅在布局加载时设置一次。

这是布局文件:

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

<data>

<variable
name="mainActivity"
type="tanager.sandbox.MainActivity" />

<variable
name="businessLogic"
type="tanager.sandbox.BusinessLogic" />
</data>

<RelativeLayout
android:id="@+id/activity_main"
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"
tools:context="tanager.sandbox.MainActivity">

<LinearLayout
android:id="@+id/linear_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">

<Button
android:id="@+id/add_key_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="@{businessLogic.getVisible()}"
android:text="@string/add_key" />

</LinearLayout>

<ToggleButton
android:id="@+id/toggleButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@id/linear_layout"
android:layout_weight="3"
android:text="ToggleButton"
android:onClick="@{() -> mainActivity.click()}"/>
</RelativeLayout>
</layout>

按下切换按钮时,它会调用主 Activity 上的一个方法,该方法会切换业务逻辑中的值。我期望在按下切换按钮时 add_key_button 自动更新其可见性。这是MainActivity:

public class MainActivity extends AppCompatActivity {
private BusinessLogic _businessLogic;
@Override
protected void onCreate(Bundle savedInstanceState) {
_businessLogic = new BusinessLogic();

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

ActivityMainBinding binding = DataBindingUtil.setContentView(this,
R.layout.activity_main);

binding.setMainActivity(this);
binding.setBusinessLogic(_businessLogic);
}

public void click() {
_businessLogic.toggleVisibility();
}
}

这是业务逻辑类:

public class BusinessLogic extends BaseObservable {

private boolean visible;
public BusinessLogic(){
visible = true;
}

public void toggleVisibility(){
visible = !visible;
notifyPropertyChanged(BR.visible);
}

@Bindable
public int getVisible(){
return visible? View.VISIBLE:View.GONE;
}
}

最佳答案

我稍微重构了你的代码,这有效

public void click() {
_businessLogic.toggleVisibility(binding.toggleButton.isChecked());
}

BusinessLogic 方法现在看起来像

public class BusinessLogic extends BaseObservable {

private boolean isToggleOn;

public BusinessLogic() {
isToggleOn = false;
}

public void toggleVisibility(boolean toggleOn) {
isToggleOn = toggleOn;
notifyPropertyChanged(BR.toggleOn);
}

@Bindable
public boolean getToggleOn() {
return isToggleOn;
}

然后在布局中,可以根据businessLogic类的getToggleOn方法设置可见性

<Button
android:id="@+id/add_key_button"
android:layout_width="match_parent"
android:visibility="@{businessLogic.toggleOn ? View.VISIBLE : View.GONE}"
android:layout_height="wrap_content"
android:text="Add key" />

记住在布局中导入 View 类

<data>

<import type="android.view.View"/>

<variable
name="mainActivity"
type="stackoverflow.MainActivity" />

关于java - 如何通过数据绑定(bind)更新布局元素的可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40448989/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com