ボタンを使用して独自のカスタムキーボードを作成しました。私はAndroidのキーボードがポップアップし、画面の半分を占うことにうんざりしていました。私のキーボード はアクティビティのレイアウトの一部です。 Androidキーボードがポップアップするのを防ぎ、EditTextsを読み取り専用にするために、2つのEditTextをフォーカス不可に設定しました。キーボードのボタンを選択すると、ボタンのテキストの値が、私がフォーカスを当てて割り当てたEditTextフィールドに表示されます(私はonTouchを使ってこれを行い、フラグ/ブール値を設定します)。フラグmIsNameSelected = true
の場合は、EditTextという名前がフォーカスされていると見なされ、そうでない場合は、電子メールのEditTextがフォーカスされていると見なされます。ここに私のジレンマがあります。EditTextの下線/スタイルを変更します.....リンクではなく、テキストを水平方向にスクロールします
この実装の第1の副作用は、テキストがEditTextフィールドに割り当てられたスペースよりも長い場合、テキストが右に消えることです。私はEditTextが正常に機能していたかのように始めの部分を省略したいが、私はそれをisFocusable(false)
に設定すると思う。回避策はありますか?
第2に、ユーザーがEditTextの1つを選択したという視覚的な手がかりを追加するために、テキストリンクではなくEditTextの下線の色を変更したいとします。テキストリンクは、フォーカス不可能な属性設定のために表示されません。私はEditTextのスタイルをプログラムで変更する方法が必要であることを知っています。これは私が探しているものです。
ボタンはXML
にtype()
メソッドを呼び出し、ここに関連するメソッドです(タイプは()XMLに呼ばれている):
public void setActivteListener(final EditText et) {
et.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
int result = event.getAction();
if (result == MotionEvent.ACTION_DOWN) {
if (et.getId() == R.id.et_customer_name) {
Log.d(TAG, "here on customer name");
mIsNameSelected = true;
updateUI();
} else if (et.getId() == R.id.et_customer_email) {
Log.d(TAG, "here on customer email");
mIsNameSelected = false;
updateUI();
}
}
return true;
}
});
}
public void type(View view) {
Log.d(TAG, "type method called");
Button btn = (Button) view;
String txt = btn.getText().toString();
char value = txt.charAt(0);
if (mIsNameSelected) {
if (mCustomerName.getText().length() > 0) {
if (txt.equalsIgnoreCase("back")) {
char[] text = mCustomerName.getText().toString().toCharArray();
char[] temp = Arrays.copyOfRange(text, 0, text.length - 1);
mCustomerName.setText(String.valueOf(temp));
}
}
if (txt.equalsIgnoreCase("space")) {
char[] text = mCustomerName.getText().toString().toCharArray();
Log.d(TAG, "the value of text now : " + String.valueOf(text));
char[] temp = Arrays.copyOf(text, text.length + 1);
Log.d(TAG, "the value of temp now: " + String.valueOf(temp));
temp[temp.length - 1] = ' ';
Log.d(TAG, "temp to string: " + String.valueOf(temp));
mCustomerName.setText(String.valueOf(temp));
}
if (!(txt.equalsIgnoreCase("back") || txt.equalsIgnoreCase("space"))) {
char[] text = mCustomerName.getText().toString().toCharArray();
char[] temp = Arrays.copyOf(text, text.length + 1);
temp[temp.length - 1] = value;
mCustomerName.setText(String.valueOf(temp));
}
} else {
Log.d(TAG, "the length of the et field is : " + mCustomerName.getText().length());
if (mCustomerEmail.getText().length() > 0) {
Log.d(TAG, "the text is longer than 0");
if (txt.equalsIgnoreCase("back")) {
Log.d(TAG, "the text = back ");
char[] text = mCustomerEmail.getText().toString().toCharArray();
char[] temp = Arrays.copyOfRange(text, 0, text.length - 1);
mCustomerEmail.setText(String.valueOf(temp));
}
}
if (txt.equalsIgnoreCase("space")) {
char[] text = mCustomerEmail.getText().toString().toCharArray();
Log.d(TAG, "the value of text now : " + String.valueOf(text));
char[] temp = Arrays.copyOf(text, text.length + 1);
Log.d(TAG, "the value of temp now: " + String.valueOf(temp));
temp[temp.length - 1] = ' ';
Log.d(TAG, "temp to string: " + String.valueOf(temp));
mCustomerEmail.setText(String.valueOf(temp));
}
if (!(txt.equalsIgnoreCase("back") || txt.equalsIgnoreCase("space"))) {
char[] text = mCustomerEmail.getText().toString().toCharArray();
char[] temp = Arrays.copyOf(text, text.length + 1);
temp[temp.length - 1] = value;
mCustomerEmail.setText(String.valueOf(temp));
}
}
}
ここ
は図であります
これはクールです。私はそれを試してみました。私が学ぶ必要がある多くのXML属性があります。私は 'stateHidden'を使用していて、 'stateAlwaysHidden'があることを認識しませんでした。この記事を見て、似たような状況に遭遇した人は、@Thomas Stevensのソリューションを使用し、最後にカーソルを追加するためにtype()メソッドのmCustomerName.setPosition(temp.length)を追加しました。どうもありがとう – Patric