2014-04-01 35 views
6

Tôi đã tạo chế độ xem tùy chỉnh cho ứng dụng của mình bằng cách mở rộng RelativeLayout. Nó mở ra như dialog, bằng cách kéo một ImageView. Nó có EditTextsButtons. Tôi đang ghi đè onKeyDown theo quan điểm của mình vì tôi cần chặn nút quay lại từ chế độ xem này. Nếu chế độ xem tùy chỉnh hiển thị, edittext chưa đạt được tiêu điểm và nếu tôi nhấn nút quay lại, chế độ xem sẽ bị loại bỏ, mong muốn.Android: Xử lý nút Quay lại từ chế độ xem tùy chỉnh

Sự cố phát sinh, khi edittext đạt được tiêu điểm và bàn phím được hiển thị, khi nhấn nút quay lại, bàn phím mềm bị loại bỏ, nhưng nếu tôi nhấn lại nút, thì thay vì loại bỏ chế độ xem tùy chỉnh, super.onKeyDown() được gọi và tôi thoát ứng dụng của tôi, trong đó tính năng mong muốn là loại bỏ chế độ xem sau khi loại bỏ bàn phím mềm. Tôi đang làm gì sai?

Dưới đây là mã giao diện tùy chỉnh của tôi:

public class AddTransactionView extends RelativeLayout implements View.OnClickListener { 
    private final String TAG = "AddTransactionView"; 

    private Context context; 

    private ViewGroup parentView; 

    private FriendsDAO mFriendsDAO; 

    private AppPreference mAppPreference; 

    private ImageLoader imageLoader; 

    private DisplayImageOptions options; 

    private CircularImageView friendsImage; 

    private Button btnIOwe, btnTheyOwe; 

    private EditText edtTransactionDesc, edtTransactionAmt; 

    private RelativeLayout relAddTransaction; 

    private int status; 

    public AddTransactionView(Context context, View anchorView, int marginTop, 
     ViewGroup parentView, FriendsDAO mFriendsDAO) { 
     super(context); 
     Log.e(TAG, "AddTransactionView constructor"); 
     this.context = context; 
     this.parentView = parentView; 
     this.mFriendsDAO = mFriendsDAO; 
     doInitialization(); 
     LayoutInflater inflater = (LayoutInflater) context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View view = inflater.inflate(R.layout.add_transaction_popup, this); 

     RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
      RelativeLayout.LayoutParams.MATCH_PARENT, 
      RelativeLayout.LayoutParams.MATCH_PARENT); 

     params.addRule(RelativeLayout.ABOVE, anchorView.getId()); 
     params.setMargins(0, marginTop, 0, 0); 
     view.setLayoutParams(params); 
     this.setFocusableInTouchMode(true); 
     this.requestFocus(); 
     parentView.addView(this); 
     initializeView(view, mFriendsDAO); 
    } 

    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     Log.e(TAG, "onKeyCodeDown"); 
     if (keyCode == KeyEvent.KEYCODE_BACK) { 
      Log.e(TAG, "onKeyCodeDown if"); 
      Log.e(TAG, "onKeyCodeDown else"); 
      dismiss(); 
      return true; 
     } else { 
      Log.e(TAG, "onKeyCodeDown default"); 
      return super.onKeyDown(keyCode, event); 
     } 
    } 

    private void dismiss() { 
     parentView.removeView(this); 
    } 
} 

PS: tôi đã không được sử dụng hộp thoại hoặc cửa sổ popup do để thiết kế hạn chế trong ứng dụng của tôi.

Cập nhật 1

Khi bàn phím được đóng lại, tập trung không thay đổi trở lại giao diện tùy chỉnh của tôi. Tôi đã thử câu trả lời được đề xuất bên dưới, nhưng tôi đã tìm ra, android không gửi các sự kiện IME khi bàn phím bị loại bỏ. Có cách nào khác để lấy nét lại tầm nhìn của tôi sau khi loại bỏ bàn phím không?

Cập nhật 2 Ngay bây giờ, tôi thấy rằng onKeyListener của edittext chỉ kích hoạt, sau khi tôi nhấn nút quay lại lần thứ hai, đó là sau khi loại bỏ bàn phím. Đó là lý do tại sao giải pháp bên dưới, không hiệu quả.

Trả lời

11

cuối cùng tôi giải quyết vấn đề của tôi, giải pháp là sử dụng dispatchKeyEventPreIme. Dưới đây là đoạn trích từ mã thực tế của tôi:

@Override 
public boolean dispatchKeyEventPreIme(KeyEvent event) { 
    Log.e(TAG, "dispatchKeyEventPreIme(" + event + ")"); 
    if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) { 
     KeyEvent.DispatcherState state = getKeyDispatcherState(); 
     if (state != null) { 
      Log.e(TAG, "dispatchKeyEventPreIme state != null"); 
      if (event.getAction() == KeyEvent.ACTION_DOWN 
        && event.getRepeatCount() == 0) { 
       Log.e(TAG, "dispatchKeyEventPreIme ACTION_DOWN"); 
       state.startTracking(event, this); 
       return true; 
      } else if (event.getAction() == KeyEvent.ACTION_UP 
        && !event.isCanceled() && state.isTracking(event)) { 
       Log.e(TAG, "dispatchKeyEventPreIme ACTION_UP"); 
       if (edtTransactionAmt.hasFocus() 
         || edtTransactionDesc.hasFocus()) { 
        Log.e(TAG, "dispatchKeyEventPreIme edittext has focus"); 
        AppUtils.hideSoftKeyboard(context, edtTransactionAmt); 
        edtTransactionAmt.clearFocus(); 
        edtTransactionDesc.clearFocus(); 
       } else { 
        Log.e(TAG, "dispatchKeyEventPreIme dismiss view"); 
        dismiss(); 
       } 
       return true; 
      } 
     } 
    } 

    return super.dispatchKeyEventPreIme(event); 
} 

Nhưng tín dụng thực tế chuyển đến this post.

-1

Bạn có thể không có onbackpress trong hoạt động chính của bạn với

if (myAddTransactionView.getVisibility == LinearLayout.VISIBLE) { 
    myAddTransactionView.dismiss(); 
} else { 
    Super..... 

Hoặc vào chỉnh sửa văn bản của bạn

edtTransactionDesc.setOnKeyListener(new OnKeyListener() 
{ 
    public boolean onKey(View v, int keyCode, KeyEvent event) 
    { 
     if (event.getAction() == KeyEvent.ACTION_DOWN) 
     { 
      //check if the right key was pressed 
      if (keyCode == KeyEvent.KEYCODE_BACK) 
      { 
       InputMethodManager imm = (InputMethodManager)getSystemService(
       Context.INPUT_METHOD_SERVICE); 
       imm.hideSoftInputFromWindow(edtTransactionDesc.getWindowToken(), 0); 
       AddTransactionView.this.requestFocus(); 
       return false; 
      } 
     } 
     return true; 
    } 
}); 
+0

Chế độ xem này sẽ hiển thị từ các đoạn. Để chặn nút quay lại từ đoạn, tôi phải thực hiện gọi lại trong hoạt động, điều này sẽ kết thúc với nhiều điều kiện và kiểm tra. Tôi muốn tránh chi phí này, vì vậy tôi cần phải chặn nút quay lại trong chế độ xem tùy chỉnh của mình. Nó sẽ giống như hộp thoại hoạt động trên nút quay lại – Nitish

+0

ok, bạn có thể xử lý việc đóng bàn phím khi nhấn phím khi sử dụng edittext hay không. và yêu cầu tập trung vào bố cục? – RuAware

+0

Tôi đã thử nó trước đó. Khi bàn phím được hiển thị, khi nhấn nút quay lại, bàn phím bị loại bỏ như mong muốn, nhưng nhật ký trong ghi đè của tôi trênKeyDown không hiển thị. – Nitish

Các vấn đề liên quan