2012-07-01 44 views
11

Rất nhiều thời gian đã được dùng để giải quyết vấn đề, và có vẻ dễ dàng, nhưng tôi thực sự mệt mỏi và không thể tìm ra giải pháp. Tôi có một Hoạt động, hoạt động có 4 thành phần EditText, 2 trong số đó có menu bật lên (AlertDialog) chứa danh sách, cái tiếp theo - bị tắt để chỉnh sửa và cuối cùng - có thể chỉnh sửa và hiển thị bàn phím mềm khi người dùng đang khai thác trên đó.requestFocus không hoạt động bình thường cho EditText

Ngoài ra, LinearLayout gốc của tôi có LinearLayout chứa bên trong RelativeLayout. Điều cuối cùng là cần thiết cho AdvBanner. LinearLayout cuối cùng (RelativeLayout) được căn chỉnh ở cuối bố cục gốc.

Phần XML mô tả nó:

<LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_gravity="bottom" 
     android:focusable="false" 
     android:focusableInTouchMode="false" 
     android:gravity="bottom"> 
    <RelativeLayout 
     android:id="@+id/AdvLayoutReserveArea" 
     android:layout_width="fill_parent" 
     android:layout_height="50dp" 
     android:background="#FFFFFF" 
     android:focusable="false" 
     android:focusableInTouchMode="false" 
     android:gravity="bottom" /> 
    </LinearLayout> 

Khi hoạt động được bắt đầu, có thể chỉnh sửa EditText đã tập trung với XANH biên giới và con trỏ nhấp nháy. Sau vài giây, AdvBanner được nạp và hiển thị. Khi nó xảy ra, EditText có thể chỉnh sửa mất tập trung .. từ lúc này, cuộc sống của tôi giống như một cơn ác mộng.

Hãy xem từng bước.

Vấn đề 1. Nếu trong thời điểm này (khi Adv nạp và xuất hiện) dùng được chỉnh sửa một lĩnh vực EditText thông qua bàn phím mềm mại, tập trung bị mất, biên giới mất một GRAY màu sắc, và nếu người dùng tiếp tục để nhập văn bản không có kết quả - các ký hiệu không được in (CURSOR trong EditText quá bị mất).

Tôi nghĩ rằng bất kỳ người dùng nào cũng sẽ khó chịu - khi bạn nhập văn bản và con trỏ không hoạt động, bởi vì ở chế độ nền, một số quảng cáo được tải và nó tập trung cho bản thân.

Để giải quyết vấn đề này, theo phương thức khi Adv được tải (được hiển thị), tôi cố gắng lấy nét lại bằng tay theo EditText theo phương thức requestFocus.

public void onAdLoaded() 
    { 
// TODO Auto-generated method stub 
// add app specific code for this event here... 
// called when an ad is successfully displayed on device    
    CountEdit1.requestFocus(); 
} 

Vâng, con trỏ được trả lại cho lĩnh vực EditText, và nếu bàn phím mềm được kích hoạt, người dùng vẫn có thể gõ văn bản, nhưng biên giới của lĩnh vực EditText ở GRAY ...

LƯU Ý: thực sự tôi MÀ KHÔNG XÁC ĐỊNH về sự khác biệt giữa đường viền XANH và XÁM của EditText tập trung .. XANH thường là khi người dùng nhấn vào nó, và có thể, khi chúng ta muốn yêu cầu lấy nét bằng tay (sử dụng requestFocus() vv)

Bài toán 2. (Kết quả của sự hòa giải Probl em # 1). Sau khi bàn phím mềm đã bị đóng, nếu người dùng chạm vào trường EditText có thể chỉnh sửa, nó sẽ lấy nét và con trỏ xuất hiện bên trong, nhưng không có phản ứng nào khi hiển thị bàn phím mềm một lần nữa! Khai thác của nó không hiển thị bàn phím mềm, nhưng trông giống như lĩnh vực chỉnh sửa trong chế độ sao chép - khi người dùng có thể chọn một văn bản và cắt/sao chép nó vào clipboard.

Mục tiêu của tôi rất dễ dàng cho một cái nhìn đầu tiên. Tôi chỉ muốn lưu con trỏ và tập trung vào trường EditText có thể chỉnh sửa (CountEdit1) trong khi bàn phím mềm được hiển thị và người dùng gõ một số văn bản. Và phản ứng bình thường khi người dùng nhấn EditText - như thường lệ, chỉ cho tôi thấy bàn phím mềm!

Tôi đã đọc tất cả các vấn đề ở đây, tôi kết hợp các phương pháp khác nhau (clearFocus, requestFocusFromTouch v.v.), không đủ thời gian và không gian để mô tả tất cả những gì tôi đã cố gắng giải quyết.Các vấn đề chính được mô tả ở trên.

Hope để được giúp đỡ và giải quyết vấn đề ... Thanks in advance ..

Trả lời

13

Mục tiêu được giải quyết, giải pháp thay thế dễ dàng hơn tôi nghĩ. Vấn đề # 2 được cố định bằng cách sử dụng phương thức onClick(). Đủ điều kiện để xuất hiện bàn phím mềm sử dụng cả hai phương thức clearFocus() và requestFocus().

CountEdit1.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) 
     { 
       CountEdit1.clearFocus(); 
     CountEdit1.requestFocus(); 
     } 
    }); 

Bàn phím mềm xuất hiện khi người dùng được khai thác trên các lĩnh vực EditText. Đã sửa lỗi.

4
userInput.post(new Runnable() { 
      public void run() { 
       userIdInput.requestFocus(); 

      } 
     }); 

kế một cái nhìn này và cho biết nếu vấn đề của bạn vẫn chưa được giải quyết.

+0

Cảm ơn, nhưng mã này không giải quyết vấn đề. Tôi cũng trước đó đã chơi với cùng một mã. Tôi đặt nó vào lớp hoạt động của mình, nhưng vẫn không có tiến bộ. Ngoài mô tả chính tôi có 2 cách giải quyết một nửa: 1) nếu tôi loại bỏ CountEdit1.requestFocus(); từ public void onAdLoaded(), sau đó Soft Keyboard xuất hiện nếu người dùng chạm vào EditText ngay cả sau khi Adv được tải, NHƯNG .. nếu Adv tải trong khi softkeyboard được hiển thị, người dùng bị mất một con trỏ trong EditText trường và không thể tiếp tục nhập văn bản. – Dimon

+0

2) với CountEdit1.requestFocus(); trong onAdLoaded(), người dùng có thể tiếp tục chỉnh sửa trường sau khi Adv được tải, nhưng sau khi softkeyboard được đóng lại, lần nhấn tiếp theo EditText sẽ không hiển thị lại bàn phím mềm! Tình huống này khiến tôi mệt mỏi quá nhiều .. – Dimon

+0

Bạn cũng không muốn hiển thị bàn phím mềm theo cách thủ công nếu nó không tự khởi động ..? – Swayam

7

trình cho tôi:

InputMethodManager mgr = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); 
editField.requestFocus(); 
mgr.showSoftInput(editField, InputMethodManager.SHOW_IMPLICIT); 
0

Bạn nên yêu cầu tập trung sau khi xem được tạo ra trong đoạn hoặc hoạt động:

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    CountEdit1.requestFocus(); 
} 
0

thử điều này:

public void onAdLoaded() 
    { 
    final Handler handler = new Handler(); 
      handler.postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        CountEdit1.requestFocus(); 
        InputMethodManager mgr = (InputMethodManager) base.getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); 
        mgr.showSoftInput(CountEdit1, InputMethodManager.SHOW_IMPLICIT); 
        CountEdit1.setSelection(CountEdit1.getText().length()); 
       } 
      },0); 
} 
Các vấn đề liên quan