ts-universal-attributes-focus.md 10.3 KB
Newer Older
Z
zengyawen 已提交
1 2
# 焦点控制

T
explain  
tianyu 已提交
3 4
自定义组件的走焦效果,可设置组件是否走焦和具体的走焦顺序,tab键或者方向键切换焦点。

H
geshi  
HelloCrease 已提交
5
>  **说明:**
G
gmy 已提交
6
>
H
HelloCrease 已提交
7
>  从API Version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
Z
zengyawen 已提交
8 9 10 11


## 属性

T
firstt  
tianyu 已提交
12 13
| **名称**               | **参数类型** | **描述**                                   |
| -------------------- | -------- | ---------------------------------------- |
Y
yamila 已提交
14
| focusable            | boolean  | 设置当前组件是否可以获焦。<br/>**说明:**<br/>存在默认交互逻辑的组件例如Button、TextInput等,默认即为可获焦,Text、Image等组件则默认状态为不可获焦。不可获焦状态下,无法触发[焦点事件](ts-universal-focus-event.md)。 |
M
match 已提交
15
| tabIndex<sup>9+<sup> | number   | 自定义组件tab键走焦能力,走焦顺序为:tabIndex大于0的组件依次递增走焦, tabIndex等于0的组件按组件树先后顺序走焦。<br />- tabIndex >= 0:表示元素是可聚焦的,并且可以通过tab键走焦来访问到该元素,tabIndex值越小,则优先获焦;反之,则后获焦。如果多个元素拥有相同的tabIndex,按照元素在当前组件树中的先后顺序获焦<br />- tabIndex < 0(通常是tabIndex = -1):表示元素是可聚焦的,但是不能通过tab键走焦来访问到该元素。<br/>默认值:0 |
T
firstt  
tianyu 已提交
16 17 18
| defaultFocus<sup>9+<sup> | boolean  | 设置当前组件是否为当前页面上的默认焦点,仅在初次创建的页面第一次进入时生效。<br/>默认值:false |
| groupDefaultFocus<sup>9+<sup> | boolean  | 设置当前组件是否为当前组件所在容器获焦时的默认焦点,仅在初次创建容器节点第一次获焦时生效。<br/>默认值:false<br/>**说明:** 必须与tabIndex联合使用,当某个容器设置了tabIndex,且容器内某子组件设置了groupDefaultFocus,当该容器首次获焦时,会自动将焦点转移至该组件上。<br/> |
| focusOnTouch<sup>9+<sup> | boolean | 设置当前组件是否支持点击获焦能力。<br/>默认值:false<br/>**说明:** 仅在组件可点击时才能正常获取焦点。 |
19 20 21 22 23 24 25 26

## focusControl<sup>9+</sup>

### requestFocus<sup>9+</sup>

requestFocus(value: string): boolean

方法语句中可使用的全局接口,调用此接口可以主动让焦点转移至参数指定的组件上。
Z
zengyawen 已提交
27

28 29 30 31 32 33 34 35 36 37 38
**参数:**

| 名称 | 类型 | 必填 | 描述 |
| ----- | ------ | ---- | ---- |
| value | string | 是   | 目标组件使用接口key(value: string)绑定的字符串。 |

**返回值:**

| 类型 | 说明 |
| ------- | ---- |
| boolean | 返回是否成功给目标组件申请到焦点。若参数指向的目标组件存在,且目标组件可获焦,则返回true,否则返回false。 |
39

H
geshi  
HelloCrease 已提交
40
>  **说明:**
41
>
Y
yamila 已提交
42
>  支持焦点控制的组件:TextInput、TextArea、Search、Button、Text、Image、List、Grid。焦点事件当前仅支持在真机上显示运行效果。
Z
zengyawen 已提交
43 44 45

## 示例

46
### 示例1
T
tianyu 已提交
47

48 49 50
defaultFocus/groupDefaultFocus/focusOnTouch示例代码:

defaultFocus可以使绑定的组件成为页面创建后首次获焦的焦点。groupDefaultFocus可以使绑定的组件成为tabIndex容器创建后首次获焦的焦点。focusOnTouch可以使绑定的组件点击后立即获焦。
51

H
geshi  
HelloCrease 已提交
52
```ts
53
// focusTest.ets
Z
zengyawen 已提交
54 55 56
@Entry
@Component
struct FocusableExample {
57 58 59 60 61 62 63 64 65 66 67
  @State inputValue: string = ''

  build() {
    Scroll() {
      Row({ space: 20 }) {
        Column({ space: 20 }) {
          Column({ space: 5 }) {
            Button('Group1')
              .width(165)
              .height(40)
              .fontColor(Color.White)
Y
yamila 已提交
68
              .focusOnTouch(true)           // 该Button组件点击后可获焦
69 70 71 72 73 74 75 76 77
            Row({ space: 5 }) {
              Button()
                .width(80)
                .height(40)
                .fontColor(Color.White)
              Button()
                .width(80)
                .height(40)
                .fontColor(Color.White)
Y
yamila 已提交
78
                .focusOnTouch(true)           // 该Button组件点击后可获焦
79 80 81 82 83 84 85 86 87 88 89 90
            }
            Row({ space: 5 }) {
              Button()
                .width(80)
                .height(40)
                .fontColor(Color.White)
              Button()
                .width(80)
                .height(40)
                .fontColor(Color.White)
            }
          }.borderWidth(2).borderColor(Color.Red).borderStyle(BorderStyle.Dashed)
Y
yamila 已提交
91
          .tabIndex(1)                      // 该Column组件为按TAB键走焦的第一个获焦的组件
92 93 94 95 96 97 98 99 100 101 102 103 104 105
          Column({ space: 5 }) {
            Button('Group2')
              .width(165)
              .height(40)
              .fontColor(Color.White)
            Row({ space: 5 }) {
              Button()
                .width(80)
                .height(40)
                .fontColor(Color.White)
              Button()
                .width(80)
                .height(40)
                .fontColor(Color.White)
Y
yamila 已提交
106
                .groupDefaultFocus(true)      // 该Button组件上级Column组件获焦时获焦
107 108 109 110 111 112 113 114 115 116 117 118
            }
            Row({ space: 5 }) {
              Button()
                .width(80)
                .height(40)
                .fontColor(Color.White)
              Button()
                .width(80)
                .height(40)
                .fontColor(Color.White)
            }
          }.borderWidth(2).borderColor(Color.Green).borderStyle(BorderStyle.Dashed)
Y
yamila 已提交
119
          .tabIndex(2)                      // 该Column组件为按TAB键走焦的第二个获焦的组件
120 121 122 123 124 125
        }
        Column({ space: 5 }) {
          TextInput({placeholder: 'input', text: this.inputValue})
            .onChange((value: string) => {
              this.inputValue = value
            })
Y
yamila 已提交
126
            .defaultFocus(true)             // 该TextInput组件为页面的初始默认焦点
127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
          Button('Group3')
            .width(165)
            .height(40)
            .fontColor(Color.White)
          Row({ space: 5 }) {
            Button()
              .width(80)
              .height(40)
              .fontColor(Color.White)
            Button()
              .width(80)
              .height(40)
              .fontColor(Color.White)
          }
          Button()
            .width(165)
            .height(40)
            .fontColor(Color.White)
          Row({ space: 5 }) {
            Button()
              .width(80)
              .height(40)
              .fontColor(Color.White)
            Button()
              .width(80)
              .height(40)
              .fontColor(Color.White)
          }
          Button()
            .width(165)
            .height(40)
            .fontColor(Color.White)
          Row({ space: 5 }) {
            Button()
              .width(80)
              .height(40)
              .fontColor(Color.White)
            Button()
              .width(80)
              .height(40)
              .fontColor(Color.White)
          }
        }.borderWidth(2).borderColor(Color.Orange).borderStyle(BorderStyle.Dashed)
Y
yamila 已提交
170
        .tabIndex(3)                      // 该Column组件为按TAB键走焦的第三个获焦的组件
171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204
      }.alignItems(VerticalAlign.Top)
    }
  }
}
```
示意图:

首次按下TAB键,焦点切换到defaultFocus绑定的组件上:

![defaultFocus](figures/defaultFocus.png)

第二次按TAB键,焦点切换到tabIndex(1)的容器上,且自动走到其内部的groupDefaultFocus绑定的组件上:

![groupDefaultFocus1](figures/groupDefaultFocus1.png)

第三次按TAB键,焦点切换到tabIndex(2)的容器上,且自动走到其内部的groupDefaultFocus绑定的组件上:

![groupDefaultFocus2](figures/groupDefaultFocus2.png)

第四次按TAB键,焦点切换到tabIndex(3)的容器上,且自动走到其内部的groupDefaultFocus绑定的组件上:

![groupDefaultFocus3](figures/groupDefaultFocus3.png)

点击绑定了focusOnTouch的组件,组件自身获焦:

![focusOnTouch](figures/focusOnTouch.png)

### 示例2

focusControl.requestFocus示例代码:

使用focusContrl.requestFocus接口使指定组件获取焦点。
```ts
// requestFocus.ets
205
import promptAction from '@ohos.promptAction';
206 207 208 209 210 211

@Entry
@Component
struct RequestFocusExample {
  @State idList: string[] = ['A', 'B', 'C', 'D', 'E', 'F', 'LastPageId']
  @State selectId: string = 'LastPageId'
Z
zengyawen 已提交
212 213 214

  build() {
    Column({ space:20 }){
215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254
      Row({space: 5}) {
        Button("id: " + this.idList[0] + " focusable(false)")
          .width(200).height(70).fontColor(Color.White)
          .key(this.idList[0])
          .focusable(false)
        Button("id: " + this.idList[1])
          .width(200).height(70).fontColor(Color.White)
          .key(this.idList[1])
      }
      Row({space: 5}) {
        Button("id: " + this.idList[2])
          .width(200).height(70).fontColor(Color.White)
          .key(this.idList[2])
        Button("id: " + this.idList[3])
          .width(200).height(70).fontColor(Color.White)
          .key(this.idList[3])
      }
      Row({space: 5}) {
        Button("id: " + this.idList[4])
          .width(200).height(70).fontColor(Color.White)
          .key(this.idList[4])
        Button("id: " + this.idList[5])
          .width(200).height(70).fontColor(Color.White)
          .key(this.idList[5])
      }
      Row({space: 5}) {
        Select([{value: this.idList[0]},
                {value: this.idList[1]},
                {value: this.idList[2]},
                {value: this.idList[3]},
                {value: this.idList[4]},
                {value: this.idList[5]},
                {value: this.idList[6]}])
          .value(this.selectId)
          .onSelect((index: number) => {
            this.selectId = this.idList[index]
          })
        Button("RequestFocus")
          .width(200).height(70).fontColor(Color.White)
          .onClick(() => {
Y
yamila 已提交
255
            var res = focusControl.requestFocus(this.selectId)      // 使选中的this.selectId的组件获焦
256
            if (res) {
257
              promptAction.showToast({message: 'Request success'})
258
            } else {
259
              promptAction.showToast({message: 'Request failed'})
260 261 262
            }
          })
      }
Z
zengyawen 已提交
263 264 265 266
    }.width('100%').margin({ top:20 })
  }
}
```
T
tianyu 已提交
267

268 269 270 271 272 273 274 275 276 277 278 279 280 281
示意图:

按下TAB键,激活焦点态显示。
申请不存在的组件获焦:

![requestFocus1](figures/requestFocus1.png)

申请不可获焦的组件获焦:

![requestFocus2](figures/requestFocus2.png)

申请存在且可获焦的组件获焦:

![requestFocus3](figures/requestFocus3.png)