首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Android EditText 實現小米計算器風格:右對齊、超寬隱藏左側、最新輸入始終可見

     編輯:程式設計疑難解答

效果描述

  • 單行、右對齊。
  • 輸入字元超出寬度時,左側內容隱藏,右側最新輸入始終顯示在可視區域。
  • 類似計算器顯示面板:數字不斷右側追加,舊數字從左側捲出。

核心屬性組合

<EditText
    android:id="@+id/calculatorDisplay"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="end"                 <!-- 右對齊(API 17+ 建議用 end/start)-->
    android:inputType="number|textNoSuggestions"
    android:singleLine="true"
    android:ellipsize="start"             <!-- 關鍵:前端省略,左側隱藏 -->
    android:scrollHorizontally="true"     <!-- 允許水平捲動 -->
    android:background="@null"
    android:text="0"
    android:textSize="36sp"
    android:textColor="#000"
    android:padding="16dp"
    android:cursorVisible="false" />

屬性解析

為什麼原代碼 `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 成本實現小米計算器顯示效果。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
屬性作用
gravity="end"內容靠右(RTL 環境自動適配)
singleLine="true"強制單行,不換行
ellipsize="start"內容過長時開頭(左側)省略顯示省略號,結尾(右側)完整顯示
scrollHorizontally="true"允許水平捲動,配合 ellipsize 實現「左側隱藏、右側可見」
inputType="number|textNoSuggestions"純數字鍵盤,禁用拼寫建議