I'm cukup baru untuk Android native development, dan I'm mencoba untuk mencari tahu bagaimana untuk menyesuaikan IME tombol tindakan. I've menatap Google dokumentasi, tapi saya dapat menemukan beberapa informasi tentang perilaku yang diharapkan.
Dari offical panduan saya memahami bahwa tindakan keyboard tombol yang dapat dikonfigurasi menggunakan atribut:
Tapi setelah beberapa upaya empiris I've ditemukan perilaku yang berbeda antara API level 15 dan selanjutnya tingkat API.
I've mengatur sederhana EditText elemen dengan atribut berikut:
<EditText
...
android:imeOptions="actionGo"
android:imeActionLabel="Custom"
android:imeActionId="666"
android:inputType="text"/>
dan saya'telah memeriksa efek dengan tingkat API yang berbeda baik dalam modus potret dan lansekap. Berikut ini adalah hasil.
API level 15 - 4.0.3
Dalam modus potret kunci label Pergi dan aksi id dilewatkan ke metode callback adalah 2, dengan demikian untuk imeOptions pengaturan.
Dalam modus lansekap kunci label/id Pergi/2 sebagai modus potret, sementara tombol yang ditampilkan di area input adalah Kustom/666, sesuai dengan imeActionLabel dan imeActionId atribut.
API level 16, 17 dan 18 - 4.1.2, 4.2.2 dan 4.3
Baik dalam modus potret dan lansekap kunci dan tombol yang ditampilkan dengan Kustom label dan terikat ke 666 id, mengabaikan imeOptions atribut.
Ketidakcocokan ini di masa mendatang cukup menjengkelkan karena:
Apakah anda tahu bagaimana untuk mendapatkan ini baik dalam API 15 dan 16+? Atau jika ada cara untuk mendapatkan perilaku yang konsisten di semua (atau setidaknya sebagian) versi API?
Mungkin aku kehilangan sesuatu dalam pengaturan IME yang bisa membenarkan perilaku yang berbeda...
Terima kasih banyak!
Sebut saja .setImeActionLabel()
programtically di pulau jawa kode untuk mengatur actionID (lagi) ke salah satu yang anda inginkan.
editText.setImeActionLabel(getString(R.string.xxx), EditorInfo.IME_ACTION_GO);
It's benar-benar sampai ke metode input aplikasi, bukan Android framework itu sendiri, untuk memutuskan apa yang harus dilakukan dengan nilai-nilai yang anda tetapkan.
Kerangka Android hanya melewati nilai yang ditetapkan melalui metode input, yang kemudian dapat memilih apa tombol untuk menunjukkan pada keyboard atau "diekstrak" EditText
dalam tampilan layar penuh. Kerangka Android pengaruh EditorInfo
dalam dua cara:-
Lewat melalui EditorInfo.makeCompatible
untuk memastikan nilai-nilai di dalamnya adalah kompatibel antara keyboard's dan aplikasi's targetApiVersion ini. Pada saat ini hanya mempengaruhi beberapa
InputType` nilai-nilai, bukan editor tindakan, namun hal ini dapat berubah jika baru editor tindakan (atau benar-benar baru pengaturan) diperkenalkan.
Set default perilaku untuk metode input, termasuk perilaku di sekitar full-screen editor. Jika metode input memilih untuk tidak mengganti perilaku default ini, maka bisa berakhir dengan perilaku yang's yang berbeda antara Android versi. Banyak keyboard yang tidak memilih untuk mengatur perilaku mereka sendiri, dengan cara yang's konsisten antara versi Android.
Untuk alasan itu,'s tidak begitu sederhana untuk mengatakan bahwa tertentu EditorInfo
lapangan memiliki efek tertentu pada setiap versi, dan ada's tidak ada cara untuk memastikan perilaku yang konsisten, bahkan pada salah satu versi Android. Semua anda're lakukan adalah memberikan petunjuk untuk metode input, yang memilih bagaimana untuk menyajikan mereka kepada pengguna.
Ketika anda memulai sebuah proyek Android baru, itu memberikan sebuah petunjuk untuk pertanyaan anda. Ada Kegiatan yang disebut LoginActivity
yang dapat anda buat sebagai default layar login. Kegiatan ini akan menghasilkan sebuah EditText
seperti demikian:
<EditText
android:id="@+id/password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/prompt_password"
android:imeActionId="@+id/login"
android:imeActionLabel="@string/action_sign_in_short"
android:imeOptions="actionUnspecified"
android:inputType="textPassword"
android:maxLines="1"
android:singleLine="true"/>
Sekarang jika anda membaca dokumentasi, anda akan tahu bahwa imeOptions
atribut memungkinkan anda untuk menentukan tindakan tambahan untuk bidang teks. Misalnya, keyboard yang muncul memiliki tindakan di sudut kanan bawah seperti "Next". Menggunakan imeOptions
anda dapat memilih tindakan lain dari daftar standar yang disediakan oleh Android. Anda dapat menentukan sesuatu seperti "actionSend" atau "actionSearch".
Setelah anda melakukan itu, agar Aktivitas anda, anda dapat mendengarkan bahwa tindakan menggunakan setOnEditorActionListener
event handler:
mPasswordView = (EditText) findViewById(R.id.password);
mPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) {
if (id == R.id.login || id == EditorInfo.IME_NULL) {
attemptLogin();
return true;
}
return false;
}
});
Perhatikan bagaimana kami menargetkan imeActionId
di sini. Ini adalah metode lain untuk target yang EditText
dalam Aktivitas anda, sementara juga memiliki fleksibilitas untuk mengubah tindakan pada keyboard input.
Jika seseorang adalah merancang sebuah custom keyboard untuk Android dan memiliki masalah dengan label Enter, anda harus melakukan berikut ini. Dalam sampel dari Android keyboard kustom kami memiliki metode berikut dalam SoftKeyboard.java:
@Override
public void onStartInput(EditorInfo attribute, boolean restarting)
{
super.onStartInput(attribute, restarting);
.
. // the implementation
.
mCurKeyboard.setImeOptions(getResources(), attribute.imeOptions);
}
Perubahan terakhir baris ke baris berikut:
mCurKeyboard.setImeOptions(getResources(), attribute);
Sekarang LatinKeyboard.java perubahan setImeOptions metode seperti di bawah ini:
void setImeOptions(Resources res, EditorInfo ei)
{
if (mEnterKey == null)
{
return;
}
switch (ei.imeOptions & (EditorInfo.IME_MASK_ACTION | EditorInfo.IME_FLAG_NO_ENTER_ACTION))
{
case EditorInfo.IME_ACTION_SEND:
mEnterKey.iconPreview = null;
mEnterKey.icon = null;
mEnterKey.label = res.getText(R.string.label_send_key);
break;
case EditorInfo.IME_ACTION_GO:
mEnterKey.iconPreview = null;
mEnterKey.icon = null;
mEnterKey.label = res.getText(R.string.label_go_key);
break;
case EditorInfo.IME_ACTION_NEXT:
mEnterKey.iconPreview = null;
mEnterKey.icon = null;
mEnterKey.label = res.getText(R.string.label_next_key);
break;
case EditorInfo.IME_ACTION_SEARCH:
mEnterKey.icon = res.getDrawable(R.drawable.sym_keyboard_search);
mEnterKey.label = null;
break;
default:
mEnterKey.iconPreview = null;
mEnterKey.label = res.getText(R.string.label_enter_key);
mEnterKey.icon = null;
break;
}
if (ei.actionLabel != null)
{
mEnterKey.iconPreview = null;
mEnterKey.icon = null;
mEnterKey.label = ei.actionLabel;
}
}
Sekarang anda keyboard kustom menunjukkan label yang tepat berdasarkan apa yang didefinisikan dalam file xml untuk imeActionLabel.