在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/Android  網(wǎng)絡(luò)安全/ Android EditText 光標(biāo)顯示在結(jié)尾處問(wèn)題

Android EditText 光標(biāo)顯示在結(jié)尾處問(wèn)題

需求

  1. 進(jìn)入頁(yè)面時(shí),EditText不自動(dòng)獲取焦點(diǎn)(沒(méi)有光標(biāo)顯示)
  2. 第一次點(diǎn)擊EditText區(qū)域時(shí),光標(biāo)顯示在結(jié)尾處,并且出現(xiàn)軟鍵盤(pán)
  3. 第二次點(diǎn)擊EditText指定位置,光標(biāo)移動(dòng)到指定位置,用戶進(jìn)行編輯

代碼

  • 布局
<RelativeLayout
    android:focusable="false"
    android:focusableInTouchMode="true">
    
    <EditText android:background="@null" />
    
</RelativeLayout>

效果

  • 實(shí)現(xiàn)了 需求:1
  • 第一次點(diǎn)擊EditText區(qū)域時(shí),鍵盤(pán)顯示,但是光標(biāo)位置是用戶點(diǎn)擊的位置,不在結(jié)尾處,除非用戶點(diǎn)擊的位置就是結(jié)尾處。

問(wèn)題

  • 如何實(shí)現(xiàn) 需求:2
回答
編輯回答
久舊酒

問(wèn)題已經(jīng)解決了

這個(gè)問(wèn)題的 關(guān)鍵點(diǎn)setSelection() 方法的執(zhí)行時(shí)機(jī)

先說(shuō)下如何解決

  • 布局中不需要做任何多余的設(shè)置
<RelativeLayout
    <!-- 這兩個(gè)設(shè)置不需要了,因?yàn)榻酉聛?lái)要在程序總設(shè)定 -->
    android:focusable="false"
    android:focusableInTouchMode="true" />
    <EditText />
</RelativeLayout>
  • Java代碼部分
public class MainActivity extends AppCompatActivity {
    private boolean isFirst = true; // 是否是第一次點(diǎn)擊 EditText
    private InputMethodManager mIMM; // 第一次點(diǎn)擊時(shí),軟鍵盤(pán)不自動(dòng)彈出,所以要手動(dòng)彈出
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mIMM = (InputMethodManager) (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
        mEditText = findViewById(R.id.xxx);
        
        // 關(guān)鍵部分
        mEditText.setFocusable(false);
        mEditText.setOnClickListener( v -> {
            if(isFirst) {
                mEditText.setFocusableInTouchMode(true);
                mEditText.requestFocus();
                mEditText.setSelection(mEditText.getText().length());
                mIMM.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
                isFirst = false;
            }
        });
    }
}

再說(shuō)下嘗試的過(guò)程

1. 直接設(shè)置 setSelection()

因?yàn)橹霸O(shè)置了 android:focusabelInTouchMode="true",所以直接設(shè)置是沒(méi)有效果的,第一次點(diǎn)擊EditText區(qū)域,會(huì)自動(dòng)彈出軟鍵盤(pán),并且光標(biāo)位置是手指點(diǎn)擊的位置

2. 自定義 EditText,重寫(xiě) onSelectionChanged(int selStart, int selEnd)方法

這個(gè)方法感知光標(biāo)位置的變化,編寫(xiě)如下代碼,可控制光標(biāo)始終在結(jié)尾處:

    @Override
    protected void onSelectionChanged(int selStart, int selEnd) {
        super.onSelectionChanged(selStart, selEnd);
            if (selStart == selEnd) { // 不考慮多個(gè)文字被選中
                setSelection(getText().length());
            }
    }

這個(gè)方法的執(zhí)行時(shí)機(jī)在自定義EditText對(duì)象初始化之前,并且在沒(méi)點(diǎn)擊之前,或者點(diǎn)擊時(shí)會(huì)多次執(zhí)行該方法,不好控制是否是第一次點(diǎn)擊。因此也沒(méi)有嘗試成功

總結(jié)

不知道有沒(méi)有更好的解決方案?期待你的回答。


2018-05-28 補(bǔ)充

實(shí)際項(xiàng)目總可能會(huì)遇到一個(gè)頁(yè)面中有多個(gè)EditText,那么 isFirstTouch 就可能被多個(gè)EditText共用,如果有這個(gè)問(wèn)題存在的話,一種解決方案是自定義EditText:

public class MyEditText extends EditText {
    private boolean isFirstTouch = true;
    // 構(gòu)造方法中調(diào)用 init() 方法
    private void init() {
        post( () -> {
            setFocusable(false);
            if(isFirst) {
                setFocusableInTouchMode(true);
                requestFocus();
                setSelection(mEditText.getText().length());
                inputMethodManger.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
                isFirst = false;
            }
        });
    }
}
2017年12月26日 11:56
編輯回答
尐潴豬

EditText有個(gè)setSelection方法,應(yīng)該可以滿足你的需求

2017年5月23日 06:54