Làm cách nào để đặt tiêu điểm trên một dạng xem khi bố cục được tạo và hiển thị?


90

Hiện tại, tôi có một bố cục chứa a Button, a TextViewvà an EditText. Khi bố cục được hiển thị, tiêu điểm sẽ tự động được đưa vào EditText, điều này sẽ kích hoạt bàn phím hiển thị trên điện thoại Android. Nó không phải là những gì tôi muốn. Có cách nào để tôi có thể đặt tiêu điểm trên TextViewhoặc không khi bố cục được hiển thị không?

Câu trả lời:


109

Đặt tiêu điểm: Khung sẽ xử lý tiêu điểm di chuyển theo phản hồi của người dùng. Để buộc tiêu điểm vào một chế độ xem cụ thể, hãy gọi requestFocus ()


17

Những công việc này:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

Nó làm gì? Có vẻ như nó đang sửa đổi một số trạng thái cho toàn bộ hoạt động chứ không chỉ một chế độ xem hoặc phân đoạn, vì vậy tôi sẽ thận trọng về điều này và không sử dụng nó trừ khi tôi hiểu tất cả các hàm ý của nó.
Vaddadi Kartick

Thật vậy, tôi sẽ không làm điều này dựa trên yêu cầu của người đăng ban đầu. Điều này có thể giải quyết vấn đề hiện tại, nhưng sử dụng nó có tác dụng phụ có thể gây ra vấn đề sau này. Đó là những vụ hack như thế này xâm nhập vào các cơ sở mã khiến các bản hack khác được thêm vào sau đó để phủ nhận bản hack ban đầu.. vòng luẩn quẩn vẫn tiếp tục .... và mọi người tự hỏi tại sao mã trở nên không thể hiểu được. Đúng vậy, bạn đoán rồi đấy .... Tôi làm việc với những người khác làm những công việc như thế này và điều đó khiến cuộc sống của tôi rất khó khăn.
dell116


6

Bộ

 android:focusable="true"

trong của bạn <EditText/>


6

Để đặt tiêu điểm, hãy trì hoãn requestFocus () bằng Trình xử lý.

private Handler mHandler= new Handler();

public class HelloAndroid extends Activity {
   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.main);

     LinearLayout mainVw = (LinearLayout) findViewById(R.id.main_layout);

     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( 
           LinearLayout.LayoutParams.FILL_PARENT,
           LinearLayout.LayoutParams.WRAP_CONTENT);

     EditText edit = new EditText(this);
     edit.setLayoutParams(params);
     mainVw.addView(edit);

     TextView titleTv = new TextView(this);
     titleTv.setText("test");
     titleTv.setLayoutParams(params);
     mainVw.addView(titleTv);

     mHandler.post(
       new Runnable() 
       {
          public void run() 
          {
            titleTv.requestFocus();
          } 
       }
     );
   }
}

5

Bạn có thể thử ẩn bàn phím. Một cái gì đó như thế này:

InputMethodManager inputManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);


3

Đặt các dòng này OnResumecũng như và đảm bảo nếu focusableInTouchđược đặt thành true trong khi bạn khởi tạo các điều khiển của mình

<controlName>.requestFocus();

<controlName>.requestFocusFromTouch();

3

để thay đổi tiêu điểm làm cho textView trong xml có thể lấy tiêu điểm

<TextView
            **android:focusable="true"**
            android:id="@+id/tv_id"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

và trong java khi tạo

textView.requestFocus();

hoặc đơn giản là ẩn bàn phím

public void hideKeyBoard(Activity act) {
    act.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
    InputMethodManager imm = (InputMethodManager) act.getSystemService(Context.INPUT_METHOD_SERVICE);
}

android: focusable = "true" và textView.requestFocus (); đã làm cho tôi. Cảm ơn!
Werner

2

Không có câu trả lời nào ở trên phù hợp với tôi. Giải pháp duy nhất (giả sử) là thay đổi TextView đầu tiên trong một EditText bị vô hiệu hóa nhận tiêu điểm và sau đó thêm

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

trong lệnh gọi lại onCreate để ngăn bàn phím được hiển thị. Bây giờ EditText đầu tiên của tôi trông giống như một TextView nhưng cuối cùng có thể lấy được tiêu điểm ban đầu.


2

Gợi ý cuối cùng là giải pháp chính xác. Xin nhắc lại, trước tiên hãy đặt android:focusable="true"trong xmltệp bố cục , sau đó requestFocus()trên chế độ xem trong mã của bạn.


1

tôi nghĩ rằng chế độ xem văn bản không thể lấy nét được. Ví dụ: cố gắng đặt tiêu điểm trên một nút hoặc đặt thuộc tính có thể lấy tiêu điểm thành true.


1

bạn có thể thêm văn bản chỉnh sửa có kích thước "0 dip" làm điều khiển đầu tiên trong xml ur, vì vậy, điều đó sẽ tập trung vào kết xuất. (đảm bảo rằng nó có thể lấy tiêu điểm và tất cả ...)


1

Bạn có thể bắt đầu bằng cách thêm android:windowSoftInputModevào hoạt động của mình trong AndroidManifest.xmltệp.

<activity android:name="YourActivity"
          android:windowSoftInputMode="stateHidden" />

Điều này sẽ làm cho bàn phím không hiển thị, nhưng EditTextvẫn lấy nét. Để giải quyết điều đó, bạn có thể thiết lập android:focusableInTouchmodeandroid:focusableđể truevào xem gốc của bạn.

<LinearLayout android:orientation="vertical"
              android:focusable="true"
              android:focusableInTouchMode="true"
              ...
              >
    <EditText
         ...
       />
    <TextView
         ...
       />
    <Button
         ...
       />
</LinearLayout>

Đoạn mã trên sẽ đảm bảo rằng nó RelativeLayoutđang được tập trung thay vìEditText


0

Tiêu điểm là để chọn các thành phần giao diện người dùng khi bạn đang sử dụng thứ gì đó ngoài cảm ứng (ví dụ: bàn phím d-pad, bàn phím, v.v.). Mọi chế độ xem đều có thể nhận tiêu điểm, mặc dù một số không thể lấy tiêu điểm theo mặc định. (Bạn có thể làm cho một chế độ xem có thể lấy tiêu điểm setFocusable(true)và buộc nó phải được lấy nét bằngrequestFocus() .)

Tuy nhiên, điều quan trọng cần lưu ý là khi bạn ở chế độ cảm ứng, tính năng lấy nét sẽ bị tắt . Vì vậy, nếu bạn đang sử dụng ngón tay của mình, việc thay đổi tiêu điểm theo chương trình sẽ không làm được gì cả. Ngoại lệ đối với các dạng xem nhận đầu vào từ trình chỉnh sửa đầu vào. An EditTextlà một ví dụ như vậy. Đối với tình huống đặc biệt này setFocusableInTouchMode(true)được sử dụng để cho bàn phím mềm biết nơi gửi đầu vào. An EditTextcó cài đặt này theo mặc định. Bàn phím mềm sẽ tự động bật lên.

Nếu bạn không muốn bàn phím mềm tự động bật lên thì bạn có thể tạm thời tắt nó như @abeljus đã lưu ý:

InputMethodManager inputManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

Tuy nhiên, khi người dùng nhấp vào EditText, nó vẫn sẽ hiển thị bàn phím.

Đọc thêm:


Câu trả lời này có sai không? Không có bình luận nào được để lại với phiếu phản đối.
Suragch
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.