मैंने 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 केवल ऊपर निकाल दिया, के बाद मैं बटन दूसरी बार वापस दबाया, कि कीबोर्ड की बर्खास्तगी के बाद है। यही कारण है कि नीचे समाधान, काम नहीं किया।
यह दृश्य टुकड़ों से दिखाई देगा। टुकड़े से वापस बटन को रोकने के लिए, मुझे गतिविधि के भीतर कॉलबैक लागू करना होगा, जो कई स्थितियों और जांचों के साथ खत्म हो जाएगा। मैं इस ओवरहेड से बचना चाहता हूं, इसलिए मुझे अपने कस्टम व्यू में बैक बटन को रोकना होगा। यह एक ही संवाद के समान होगा जैसे बैक बटन – Nitish
ठीक है, क्या आप edittext का उपयोग करते समय बैकप्रेस पर कीबोर्ड को बंद कर सकते हैं। और लेआउट पर requestfocus? – RuAware
मैंने इसे पहले कोशिश की। जब कीबोर्ड दिखाई दे रहा था, बैक बटन दबाकर, कुंजीपटल वांछित के रूप में खारिज कर दिया गया था, लेकिन मेरे ओवरराइड पर लॉग इन किया गया था KeyDown दिखाई नहीं दिया। – Nitish