2014-04-01 50 views
6

मैंने RelativeLayout को बढ़ाकर अपने ऐप के लिए कस्टम व्यू बनाया था। ImageView खींचकर, यह dialog के रूप में खुलता है। इसमें EditTexts और Buttons है। मैं अपने दृश्य में onKeyDown ओवरराइड कर रहा हूं क्योंकि मुझे इस दृश्य से वापस बटन को अवरुद्ध करने की आवश्यकता है। यदि कस्टम दृश्य दिखाई देता है, तो एडिटेक्स्ट ने फोकस नहीं प्राप्त किया है, और यदि मैं बैक बटन दबाता हूं, तो दृश्य को खारिज कर दिया जाएगा, जो वांछित है।एंड्रॉइड: कस्टम दृश्य से हैंडल बैक बटन

समस्या उत्पन्न होती है, जब एडिटेक्स्ट फोकस प्राप्त कर लेता है, और बैक बटन दबाकर कीबोर्ड दिखाई देता है, सॉफ्ट कीबोर्ड को खारिज कर दिया जाता है, लेकिन यदि मैं फिर से बटन दबाता हूं, तो कस्टम व्यू को खारिज करने के बजाय, super.onKeyDown() कहा जाता है और मैं बाहर निकलता हूं मेरा ऐप, जहां वांछित सुविधा है, सॉफ्ट कीबोर्ड को बर्खास्त करने के बाद दृश्य को खारिज करना है। मैं क्या गलत कर रहा हूं?

नीचे मेरी कस्टम दृश्य कोड है:

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); 
    } 
} 

पुनश्च: मैं इस्तेमाल नहीं किया था संवाद या पॉपअप मेरे एप्लिकेशन में सीमा डिजाइन की वजह से खिड़की।

अद्यतन 1

जब कीबोर्ड बंद कर दिया है, ध्यान वापस नहीं पाली मेरी कस्टम दृश्य के लिए करता है। मैंने नीचे सुझाए गए उत्तर की कोशिश की, लेकिन मुझे पता चला कि कुंजीपटल खारिज होने पर एंड्रॉइड आईएमई कार्यक्रम नहीं भेजता है। कुंजीपटल बर्खास्तगी के बाद मेरे दृश्य पर वापस ध्यान केंद्रित करने का कोई और तरीका है?

अद्यतन 2 बस अब, मैंने पाया कि edittext की onKeyListener केवल ऊपर निकाल दिया, के बाद मैं बटन दूसरी बार वापस दबाया, कि कीबोर्ड की बर्खास्तगी के बाद है। यही कारण है कि नीचे समाधान, काम नहीं किया।

उत्तर

11

मैं अंत में मेरी समस्या हल संपादित करें पर अपनी मुख्य गतिविधि में onbackpress नहीं हो सकता, समाधान dispatchKeyEventPreIme उपयोग करने के लिए है। नीचे अपने वास्तविक कोड से छोटा सा अंश है:

@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); 
} 

लेकिन वास्तविक क्रेडिट this post को जाता है।

-1

आप

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

साथ या अपने पाठ

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

यह दृश्य टुकड़ों से दिखाई देगा। टुकड़े से वापस बटन को रोकने के लिए, मुझे गतिविधि के भीतर कॉलबैक लागू करना होगा, जो कई स्थितियों और जांचों के साथ खत्म हो जाएगा। मैं इस ओवरहेड से बचना चाहता हूं, इसलिए मुझे अपने कस्टम व्यू में बैक बटन को रोकना होगा। यह एक ही संवाद के समान होगा जैसे बैक बटन – Nitish

+0

ठीक है, क्या आप edittext का उपयोग करते समय बैकप्रेस पर कीबोर्ड को बंद कर सकते हैं। और लेआउट पर requestfocus? – RuAware

+0

मैंने इसे पहले कोशिश की। जब कीबोर्ड दिखाई दे रहा था, बैक बटन दबाकर, कुंजीपटल वांछित के रूप में खारिज कर दिया गया था, लेकिन मेरे ओवरराइड पर लॉग इन किया गया था KeyDown दिखाई नहीं दिया। – Nitish

संबंधित मुद्दे