Vì vậy, tôi có những gì dường như là một vấn đề phổ biến, đó là EditText trong hộp thoại của tôi không hiển thị khi nó được lấy tiêu điểm. Tôi đã thấy một số cách giải quyết, chẳng hạn như trong chuỗi này , cái này và cái này (và nhiều cách khác), nhưng tôi chưa bao giờ thấy một lời giải thích thỏa đáng cho lý do tại sao điều này xảy ra ngay từ đầu.
Tôi muốn android sử dụng hành vi mặc định của riêng nó cho EditTexts hơn là xây dựng hành vi của riêng tôi, nhưng có vẻ như mọi người (trong các chuỗi đó) đã chấp nhận rằng hành vi mặc định cho EditTexts trong Dialogs là chỉ cung cấp con trỏ và không có bàn phím. Tại sao lại như vậy?
Đối với bản ghi, không có cách giải quyết nào trong số này có vẻ hiệu quả với tôi - cách gần nhất mà tôi có thể đến là buộc bàn phím xuất hiện bên dưới hộp thoại (sử dụng InputMethodManager.toggleSoftKeyboard (*)). Cấu hình cụ thể của tôi là API15, EditText hiển thị ở chân trang trên ListView trong AlertDialog. EditText android: focusable = "true" đã được đặt và onFocusChangeListener đang nhận các sự kiện tiêu điểm.
Biên tập:
Theo yêu cầu, đây là đoạn mã cụ thể mà tôi đang làm việc. Tôi sẽ không bận tâm đến toàn bộ bố cục, nhưng trong ứng dụng cụ thể này, EditText xuất hiện để phản hồi lại việc nhấn một nút trên hộp thoại (tương tự như một dạng xem hành động ). Nó được chứa trong một RelativeLayout theo mặc định có khả năng hiển thị "biến mất":
<RelativeLayout
android:id="@+id/relLay"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:visibility="gone"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp">
<ImageButton
android:id="@+id/cancelBut"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:background="@color/transparent"
android:src="@drawable/cancelButton"
android:layout_margin="5dp"/>
<ImageButton
android:id="@+id/okBut"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toLeftOf="@id/cancelBut"
android:background="@color/transparent"
android:src="@drawable/okButton"
android:layout_margin="5dp" />
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="text"
android:focusable="true"
android:layout_toLeftOf="@id/okBut"/>
</RelativeLayout>
Mã xây dựng điều này sẽ đặt khả năng hiển thị của relativeLayout thành "Hiển thị" (và ẩn các phần tử giao diện người dùng khác). Đây nên là đủ để kéo lên bàn phím khi EditText được tập trung, dựa trên kinh nghiệm của tôi với EditText. Tuy nhiên, vì một số lý do mà điều này không đúng như vậy. Tôi có thể đặt onFocusChangeListener sau:
edit_text.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
// For whatever reason we need to request a soft keyboard.
InputMethodManager imm = (InputMethodManager)dlg.getWindow().getContext().getSystemService(_Context.INPUT_METHOD_SERVICE);
if(hasFocus)
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
Log.v("DialogProblem", "Focus requested, " + (hasFocus?"has focus.":"doesn't have focus."));
}
}
});
Sử dụng cấu hình này, khi tôi nhập EditText lần đầu tiên , onFocusChangedListener sẽ kích hoạt và tạo ra một nhật ký luôn trông giống như sau:
Focus requested, has focus.
Focus requested, doesn't have focus.
Focus requested, has focus.
Bàn phím hiển thị và sau đó biến mất, có thể là do tôi bật tắt nó hai lần, nhưng ngay cả khi tôi đảm bảo rằng nó vẫn hoạt động, nó nằm sau cửa sổ hộp thoại (trong một khu vực xám xịt) và không có cách nào để truy cập mà không đóng hộp thoại .
Điều đó nói rằng, tôi muốn nhấn mạnh rằng mặc dù tôi có thể làm cho công việc này hoạt động, nhưng tôi chủ yếu quan tâm đến việc tìm ra lý do đơn giản tại sao EditText không kích hoạt ngay từ đầu và tại sao điều này dường như là rất phổ biến!