2013-02-10 11 views
7

के लिए कीबोर्ड 'हो गया' पकड़ें मेरे पास AlertDialog है, जिसमें कुछ पाठ, NumberPicker, एक ठीक है, और एक रद्द है।नंबरपिकर

package org.dyndns.schep.example; 
import android.os.Bundler; 
import android.view.View; 
import android.widget.NumberPicker; 
import android.app.Activity; 
import android.app.AlertDialog; 
import android.app.Dialog; 
import android.app.DialogFragment; 
import android.content.DialogInterface; 

public class FooFragment extends DialogFragment { 
    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     mParent = (MainActivity) activity; 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
     builder.setPositiveButton(android.R.string.ok, 
       new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int id) { 
       mParent.setFoo(foo()); 
      } 
     }) 
     .setNegativeButton(android.R.string.cancel, null); 

     View view = getActivity().getLayoutInflater.inflate(
       R.layout.dialog_foo, null); 
     mPicker = (NumberPicker) view.findViewById(R.id.numberPicker1); 
     mPicker.setValue(mParent.getFoo()); 
     builder.setView(view); 
     return builder.create(); 
    } 

    public int foo() { 
     return mPicker.getValue(); 
    } 

    private MainActivity mParent; 
    private NumberPicker mPicker; 
} 

(यह संवाद अभी तक बातें यह रोकें पर राज्य को बचाने के लिये और फिर से शुरू करें, मुझे पता है। चाहिए नहीं है)

मैं नरम कुंजीपटल या अन्य IME पर "पूर्ण" कार्रवाई चाहते हैं संवाद को खारिज करने के लिए "ठीक" दबाया गया था, क्योंकि संपादित करने के लिए केवल एक विजेट है।

ऐसा लगता है कि एक आईएमई "होन" से निपटने का सबसे अच्छा तरीका आमतौर पर TextView पर setOnEditorActionListener पर है। लेकिन मेरे पास TextView वैरिएबल नहीं है, और NumberPicker स्पष्ट रूप से TextView, या इसी तरह के संपादक कॉलबैक का पर्दाफाश नहीं करता है। (हो सकता है कि NumberPicker एक निरंतर आईडी मैं findViewById उपयोग करने के लिए खोज सकते हैं के साथ एक TextView शामिल?)

NumberPicker.setOnValueChangedListener "पूर्ण" कार्रवाई पर शुरू हो रहा हो जाता है, लेकिन यह भी आग जब दोहन या नंबर, की सूची flicking जो निश्चित रूप से नहीं करना चाहिए संवाद को खारिज कर दें।

this प्रश्न के आधार पर, मैंने setOnKeyListener की जांच करने का प्रयास किया, लेकिन सॉफ्ट इंटरफ़ेस का उपयोग करते समय वह इंटरफ़ेस ट्रिगर नहीं हुआ। कुल आश्चर्य नहीं है, क्योंकि KeyEvent दस्तावेज़ीकरण से पता चलता है कि यह हार्डवेयर घटनाओं के लिए अधिक है, और हाल के एपीआई में सॉफ्ट कीबोर्ड उन्हें बिल्कुल नहीं भेजेगा।

मैं अपने संवाद की "ठीक" कार्रवाई में आईएमई "पूर्ण" कैसे कनेक्ट कर सकता हूं?

संपादित करें: स्रोत के दिखता से, एक NumberPicker लेआउट एक EditText शामिल करता है, लेकिन अपने आईडी पैकेज com.android.internal में id/numberpicker_input है। इसका उपयोग करना आसान नहीं होगा, और स्पष्ट रूप से निराश है। लेकिन ऐसा लगता है कि व्यवहार करने के लिए केवल हैक तरीके ही हो सकते हैं।

+0

क्या आपने किसी भी कस्टम नंबर पिकर की कोशिश की है जो पुराने एंड्रॉइड संस्करणों के अनुकूल है। मुझे यकीन है कि आपके पास उनके 'एडिटटेक्स्ट' आईडी तक पहुंच होगी। आप इसे देख सकते हैं: https://github.com/SimonVT/android-numberpicker – Naveen

उत्तर

8

मैं अपने संवाद की "ठीक" कार्रवाई में आईएमई "हो गया" कैसे कनेक्ट कर सकता हूं?

समस्या यह है कि आप IME की घटनाओं पारित नहीं हो सकता है अगर आप एक श्रोता TextView विजेट जो वर्तमान IME के ​​साथ काम करता है पर सेट नहीं है। जो भी आप चाहते हैं उसे करने का एक तरीका है NumberPicker के बच्चे को अपना खुद का तर्क हुक करना है जो आईएमई के साथ काम करता है (जैसा कि आप पहले से ही अपने प्रश्न के अंतिम भाग में बात करते हैं)। उस विजेट को पकड़ने के लिए कुछ आईडी या अन्य लेआउट ट्रिक्स (जो समस्याग्रस्त हो सकते हैं) का उपयोग करने से बचने के लिए, आप एक लालची रणनीति का उपयोग कर सकते हैं, श्रोता को NumberPicker से किसी भी विजेट पर सेट कर सकते हैं जो वांछित ईवेंट (TextViews या किसी उप-वर्ग को ट्रिगर कर सकता है) TextView)।कुछ इस तरह:

private AlertDialog mCurrentDialog; 
    private List<TextView> mTargets = new ArrayList<TextView>(); 
    private OnEditorActionListener mListener = new OnEditorActionListener() { 

     @Override 
     public boolean onEditorAction(TextView v, int actionId, 
       KeyEvent event) { 
      if (actionId == EditorInfo.IME_ACTION_DONE) { 
       // if a child of NumberPicker triggers the DONE editor event 
       // get a reference to the positive button(which you use in your 
       // code) and click it 
       mCurrentDialog.getButton(Dialog.BUTTON_POSITIVE).performClick(); 
      } 
      return false; 
     } 
    }; 

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    // ... 
    mPicker = (NumberPicker) view.findViewById(R.id.numberPicker1); 
     mPicker.setValue(mParent.getFoo()); 
     // clear any previous targets 
     mTargets.clear(); 
     // find possible targets in the NumberPicker 
     findTextViews(mPicker); 
     // setup those possible targets with our own logic 
     setupEditorListener();   
     builder.setView(view); 
     // get a reference to the current showed dialog 
     mCurrentDialog = builder.create();   
     return mCurrentDialog; 
    } 

कहाँ तरीके हैं:

private void findTextViews(ViewGroup parent) { 
     final int count = parent.getChildCount(); 
     for (int i = 0; i < count; i++) { 
      final View child = parent.getChildAt(i); 
      if (child instanceof ViewGroup) { 
       findTextViews((ViewGroup) child); 
      } else if (child instanceof TextView) { 
       mTargets.add((TextView) child); 
      } 
     } 
    } 

    private void setupEditorListener() { 
     final int count = mTargets.size(); 
     for (int i = 0; i < count; i++) { 
      final TextView target = mTargets.get(i); 
      target.setOnEditorActionListener(mListener); 
     } 
    } 

अन्य संभावित (और उचित) समाधान (नवीन पहले से ही अपने टिप्पणी में उल्लेख किया है) की तरह NumberPicker के बंदरगाहों में से एक का उपयोग करने के लिए है वर्ग (या एसडीके से एक को संशोधित करें) और अपना खुद का विजेट आईडी डालें (जो विजेट को एक साधारण कार्य का संदर्भ देगा)। अब इसे लागू करना आसान होगा लेकिन लंबे समय तक बनाए रखने के लिए असुविधाजनक है।

+0

क्या आपको लगता है कि जब कोई पाया जाता है तो केवल खोज लूप को तोड़ने के बजाय टेक्स्ट व्यू की सूची का उपयोग करने में परेशानी होती है? – aschepler

+0

@aschepler यह मुसीबत के लायक है (बस सुरक्षित होने के लिए)। मुझे यकीन नहीं है कि यह अनुमति है (एंड्रॉइड गठबंधन द्वारा) लेकिन एक डिवाइस निर्माता अपने स्वयं के 'नंबरपिकर' विजेट को बना सकता है जिसमें एक या कई अतिरिक्त 'टेक्स्ट व्यू/एडिटटेक्स' (उदाहरण के लिए हेडर नहीं है?) सामान्य के अलावा इनपुट 'संपादन टेक्स्ट'। साथ ही, यह सूची प्रदर्शन को कम नहीं करती है (कि रिकर्सिव विधि एक छोटे दृश्य पदानुक्रम को पार्स करेगी) या स्मृति खपत (क्योंकि विजेट पहले ही लेआउट में हैं, आप केवल उन संदर्भों को संग्रहीत कर रहे हैं)। – Luksprog

+0

क्या कस्टम 'नंबरपिकर' बनाना बेहतर नहीं है और वही करें? कोड बहुत साफ होगा – Jin35

0

मेरी खोज और प्रयोग ने खाली हाथ भी निकाला है। उस ने कहा कि मैं इस तरह के व्यवहार को प्रोत्साहित नहीं करूंगा क्योंकि इससे ज्यादा समझ नहीं आती है।

यदि आपको नंबरपिकर की आवश्यकता है तो ऐसा इसलिए है क्योंकि आप जिस मूल्य की आवश्यकता है उसे स्क्रॉल करने की सुविधा चाहते हैं, इसे दर्ज नहीं करते (हालांकि यह संभव है)। यदि आप मान दर्ज करना चाहते हैं तो आप एक संपादन टेक्स्ट का उपयोग करेंगे और आप समस्याओं के बिना आपको जो भी चाहिए उसे लागू करने में सक्षम होंगे।

वैकल्पिक रूप से आपको स्रोत से नंबरपिकर कार्यान्वयन की प्रतिलिपि बनाना है और फिर इसे अपनी आवश्यकताओं के अनुसार बदलना है (ime विकल्पों को जोड़कर एफएक्स)।