| 屬性 | 作用 |
gravity="end" | 內容靠右(RTL 環境自動適配) |
singleLine="true" | 強制單行,不換行 |
ellipsize="start" | 內容過長時開頭(左側)省略顯示省略號,結尾(右側)完整顯示 |
scrollHorizontally="true" | 允許水平捲動,配合 ellipsize 實現「左側隱藏、右側可見」 |
inputType="number|textNoSuggestions" | 純數字鍵盤,禁用拼寫建議 |
為什麼原代碼 `ellipsize="end"` 不對?
`ellipsize="end"` 會隱藏結尾(右側),導致最新輸入的數字被省略號遮擋,違背計算器邏輯。必須用 `start`。
進階:程式碼動態控制游標與選取
EditText et = findViewById(R.id.calculatorDisplay);
// 禁止長按選取/複製/貼上彈窗干擾
et.setCustomSelectionActionModeCallback(new ActionMode.Callback() {
public boolean onCreateActionMode(ActionMode mode, Menu menu) { return false; }
public boolean onPrepareActionMode(ActionMode mode, Menu menu) { return false; }
public boolean onActionItemClicked(ActionMode mode, MenuItem item) { return false; }
public void onDestroyActionMode(ActionMode mode) {}
});
et.setLongClickable(false);
et.setTextIsSelectable(false);
// 確保新輸入後游標在末尾,畫面自動捲動顯示最新字元
et.setOnKeyListener((v, keyCode, event) -> {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
et.post(() -> {
et.setSelection(et.getText().length()); // 游標移至末尾
// 強制水平捲動到最右(某些機型需要)
et.scrollTo(et.getWidth(), 0);
});
}
return false;
});
替代方案:自定義 View(極致控制)
若需更細粒度動畫(如數字滾動、單字元淡入),可繼承 `View`,`onDraw()` 中用 `drawText()` 繪製,配合 `ValueAnimator` 實現計算器級動畫。但 95% 場景上述 XML + 少量代碼即可完美滿足。
總結
關鍵三要素:gravity="end" + ellipsize="start" + scrollHorizontally="true"。這組屬性組合利用 Android 文字佈局引擎原生特性,零自定義 View 成本實現小米計算器顯示效果。
- 上一篇文章: C 語言使用 sscanf 從字串按空格分割提取欄位
- 下一篇文章: Android 驗證指定 WiFi 真正連接成功:廣播監聽 NETWORK_STATE_CHANGED_ACTION
Copyright ©
程式碼之家 All Rights Reserved