判断组件当前状态

footballboy
发布于 2021-4-13 10:45
浏览
0收藏

setComponentStateChangedListener方法判断组件当前状态

今天看到有坛友问到按钮点击调用setComponentStateChangedListener方法监控组件状态改变,触发了两次这个是正常吗?那接下来我来分享一下我的理解,有不对的请指出,谢谢!

  首先我们先看布局页面,就是个简单的按钮,代码如下

<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    ohos:height="match_parent"
    ohos:width="match_parent"
    ohos:orientation="vertical">

    <Button
        ohos:id="$+id:btnStateTest"
        ohos:height="match_content"
        ohos:width="match_content"
        ohos:text_size="30vp"
        ohos:background_element="gray"
        ohos:center_in_parent="true"
        ohos:text="测试按钮"
        ohos:bottom_margin="10vp"></Button>
</DirectionalLayout>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

 

然后我们看Java代码如下

package com.example.phonetest.slice;

import com.example.phonetest.ResourceTable;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.agp.components.Button;
import ohos.agp.components.Component;
import ohos.agp.components.ComponentState;
import ohos.hiviewdfx.HiLog;
import ohos.hiviewdfx.HiLogLabel;

public class ButtonComponentStateTestSlice extends AbilitySlice {
    static final HiLogLabel label=new HiLogLabel(HiLog.LOG_APP,0x0001,"按钮状态测试");
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_ability_button_component_state_test);
        Button btnStateTest=(Button)findComponentById(ResourceTable.Id_btnStateTest);
        HiLog.info(label,"按钮Id:"+btnStateTest.getId());
        btnStateTest.setComponentStateChangedListener((c,i)->{
            HiLog.info(label,"组件Id:"+c.getId());
            HiLog.info(label,"当前ViewState:"+i);

        });


    }

    @Override
    public void onActive() {
        super.onActive();
    }

    @Override
    public void onForeground(Intent intent) {
        super.onForeground(intent);
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.

 

然后我们看一下点击按钮打印的日志,如下图判断组件当前状态-鸿蒙开发者社区

为了验证是否都是同一个按钮测试的,我也将按钮的Id打出来了,我们可以看出事件方法里面触发的两次是同一个按钮,那么这两次状态改变是针对哪些状态呢,我找到ComponentState类的状态如下图,

判断组件当前状态-鸿蒙开发者社区

看了以后一脸蒙啊,完全对不上,这怎么搞,后来研究了半天,发现这个类里面还有个方法名叫isStateMatched,然后我想了一下是不是要用这个去匹配,然后我在setComponentStateChangedListener方法里面加入了如下测试代码

if(ComponentState.isStateMatched(ComponentState.COMPONENT_STATE_CHECKED,i)) {
    HiLog.info(label,"匹配ComponentState.COMPONENT_STATE_PRESSED");
    return;
}
if(ComponentState.isStateMatched(ComponentState.COMPONENT_STATE_DISABLED,i)) {
    HiLog.info(label,"匹配ComponentState.COMPONENT_STATE_DISABLED");
    return;
}
 if(ComponentState.isStateMatched(ComponentState.COMPONENT_STATE_EMPTY,i)) {
    HiLog.info(label,"匹配ComponentState.COMPONENT_STATE_EMPTY");
    return;
}
if(ComponentState.isStateMatched(ComponentState.COMPONENT_STATE_FOCUSED,i)) {
    HiLog.info(label,"匹配ComponentState.COMPONENT_STATE_FOCUSED");
    return;
}
if(ComponentState.isStateMatched(ComponentState.COMPONENT_STATE_HOVERED,i)) {
    HiLog.info(label,"匹配ComponentState.COMPONENT_STATE_HOVERED");
    return;
}
if(ComponentState.isStateMatched(ComponentState.COMPONENT_STATE_PRESSED,i)) {
    HiLog.info(label,"匹配ComponentState.COMPONENT_STATE_PRESSED");
    return;
}
if(ComponentState.isStateMatched(ComponentState.COMPONENT_STATE_SELECTED,i)) {
    HiLog.info(label,"匹配ComponentState.COMPONENT_STATE_PRESSED");
    return;
}
HiLog.info(label,"未匹配任何状态");
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.

 

然后我再次单击测试按钮然后,我们看一下点击效果判断组件当前状态-鸿蒙开发者社区

 

然后得出的结论按钮为什么触发了两次,一次是按钮按下的状态,按下以后然后是恢复原来的未知状态。

接下来我又添加了几个按钮测试了一下手动禁用和手动按下状态,完全代码如下

 

<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    ohos:height="match_parent"
    ohos:width="match_parent"
    ohos:orientation="vertical">

    <Button
        ohos:id="$+id:btnStateTest"
        ohos:height="match_content"
        ohos:width="match_content"
        ohos:text_size="30vp"
        ohos:background_element="gray"
        ohos:center_in_parent="true"
        ohos:text="测试按钮"
        ohos:bottom_margin="10vp"></Button>
    <Button
        ohos:id="$+id:btnStateDisabled"
        ohos:height="match_content"
        ohos:width="match_content"
        ohos:text_size="30vp"
        ohos:background_element="gray"
        ohos:center_in_parent="true"
        ohos:text="禁用测试按钮"
        ohos:bottom_margin="10vp"></Button>
    <Button
        ohos:id="$+id:btnStateEnable"
        ohos:height="match_content"
        ohos:width="match_content"
        ohos:text_size="30vp"
        ohos:background_element="gray"
        ohos:center_in_parent="true"
        ohos:text="启用测试按钮"
        ohos:bottom_margin="10vp"></Button>

    <Button
        ohos:id="$+id:btnStatePressed"
        ohos:height="match_content"
        ohos:width="match_content"
        ohos:text_size="30vp"
        ohos:background_element="gray"
        ohos:center_in_parent="true"
        ohos:text="手动设置测试按钮按下"
        ohos:bottom_margin="10vp"></Button>

    <Button
        ohos:id="$+id:btnStateCancelPressed"
        ohos:height="match_content"
        ohos:width="match_content"
        ohos:text_size="30vp"
        ohos:background_element="gray"
        ohos:center_in_parent="true"
        ohos:text="手动取消测试按钮按下"
        ohos:bottom_margin="10vp"></Button>

</DirectionalLayout>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.

 

Java代码如下

package com.example.phonetest.slice;

import com.example.phonetest.ResourceTable;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.agp.components.Button;
import ohos.agp.components.Component;
import ohos.agp.components.ComponentState;
import ohos.hiviewdfx.HiLog;
import ohos.hiviewdfx.HiLogLabel;

public class ButtonComponentStateTestSlice extends AbilitySlice {
    static final HiLogLabel label=new HiLogLabel(HiLog.LOG_APP,0x0001,"按钮状态测试");
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_ability_button_component_state_test);
        Button btnStateTest=(Button)findComponentById(ResourceTable.Id_btnStateTest);
        HiLog.info(label,"按钮Id:"+btnStateTest.getId());
        btnStateTest.setComponentStateChangedListener((c,i)->{
            HiLog.info(label,"组件Id:"+c.getId());
            HiLog.info(label,"当前ViewState:"+i);
            if(ComponentState.isStateMatched(ComponentState.COMPONENT_STATE_CHECKED,i)) {
                HiLog.info(label,"匹配ComponentState.COMPONENT_STATE_PRESSED");
                return;
            }
            if(ComponentState.isStateMatched(ComponentState.COMPONENT_STATE_DISABLED,i)) {
                HiLog.info(label,"匹配ComponentState.COMPONENT_STATE_DISABLED");
                return;
            }
             if(ComponentState.isStateMatched(ComponentState.COMPONENT_STATE_EMPTY,i)) {
                HiLog.info(label,"匹配ComponentState.COMPONENT_STATE_EMPTY");
                return;
            }
            if(ComponentState.isStateMatched(ComponentState.COMPONENT_STATE_FOCUSED,i)) {
                HiLog.info(label,"匹配ComponentState.COMPONENT_STATE_FOCUSED");
                return;
            }
            if(ComponentState.isStateMatched(ComponentState.COMPONENT_STATE_HOVERED,i)) {
                HiLog.info(label,"匹配ComponentState.COMPONENT_STATE_HOVERED");
                return;
            }
            if(ComponentState.isStateMatched(ComponentState.COMPONENT_STATE_PRESSED,i)) {
                HiLog.info(label,"匹配ComponentState.COMPONENT_STATE_PRESSED");
                return;
            }
            if(ComponentState.isStateMatched(ComponentState.COMPONENT_STATE_SELECTED,i)) {
                HiLog.info(label,"匹配ComponentState.COMPONENT_STATE_PRESSED");
                return;
            }
            HiLog.info(label,"未匹配任何状态");
        });
        btnStateTest.setPressState(true);
        btnStateTest.setPressState(false);
        Button btnStateDisabled=(Button)findComponentById(ResourceTable.Id_btnStateDisabled);
        btnStateDisabled.setClickedListener(c->{
            HiLog.info(label,"禁用测试按钮");
            btnStateTest.setEnabled(false);
        });

        Button btnStateEnable=(Button)findComponentById(ResourceTable.Id_btnStateEnable);
        btnStateEnable.setClickedListener(c->{
            HiLog.info(label,"启用测试按钮");
            btnStateTest.setEnabled(true);
        });

        Button btnStatePressed=(Button)findComponentById(ResourceTable.Id_btnStatePressed);
        btnStatePressed.setClickedListener(c->{
            HiLog.info(label,"设置为pressState");
            btnStateTest.setPressState(true);
        });

        Button btnStateCancelPressed=(Button)findComponentById(ResourceTable.Id_btnStateCancelPressed);
        btnStateCancelPressed.setClickedListener(c->{
            HiLog.info(label,"取消pressState");
            btnStateTest.setPressState(false);
        });

    }

    @Override
    public void onActive() {
        super.onActive();
    }

    @Override
    public void onForeground(Intent intent) {
        super.onForeground(intent);
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.

 

然后在手动触发按下按钮,你又会发现一个有趣的现象就是直接在onStart方法里面调用setPressState方法和在按钮里面调用setPressState方法监控到状态码竟是不一样的,代码如下图判断组件当前状态-鸿蒙开发者社区

运行结果如下图

判断组件当前状态-鸿蒙开发者社区

 

所以肯定要靠isStateMatched来判断。

 

 

已于2021-4-13 10:45:26修改
收藏
回复
举报
回复
    相关推荐