2011-04-01 22 views
15

मैंने निम्न कार्यक्षमता का परीक्षण करने के लिए एक छोटा सा अनुप्रयोग बनाया है। जब मेरी गतिविधि लॉन्च होती है, तो उसे सॉफ्टकीबोर्ड के साथ लॉन्च करने की आवश्यकता होती है।शो सॉफ़्ट इनपुट के साथ एंड्रॉइड शो सॉफ्टकीबोर्ड काम नहीं कर रहा है?

मेरा कोड काम नहीं करता है ?!

मैंने कोड में मैनिफेस्ट और विभिन्न झंडे में इनपुट "विधि" में विभिन्न "राज्य" सेटिंग्स की कोशिश की है।

मैंने एंड्रॉइडमैनीफेस्ट.एक्सएमएल में सेटिंग शामिल की है और स्पष्ट रूप से केवल एक ही गतिविधि के निर्माण में शामिल किया है।

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="com.mycompany.android.studyIme" 
     android:versionCode="1" 
     android:versionName="1.0"> 
    <uses-sdk android:minSdkVersion="7" /> 

    <application android:icon="@drawable/icon" android:label="@string/app_name"> 
     <activity android:name=".StudyImeActivity" 
        android:label="@string/app_name" 
        android:windowSoftInputMode="stateAlwaysVisible"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

    </application> 
</manifest> 

... मुख्य लेआउट (main.xml) ...

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
    <TextView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/hello" 
     /> 
    <EditText 
     android:id="@+id/edit_sample_text" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:hint="@string/hello" 
     android:inputType="textShortMessage" 
    /> 
</LinearLayout> 

... और कोड ...

public class StudyImeActivity extends Activity { 
    private EditText mEditTextStudy; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     mEditTextStudy = (EditText) findViewById(R.id.edit_study); 
     InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
     imm.showSoftInput(mEditTextStudy, InputMethodManager.SHOW_FORCED); 
    } 
} 
+0

हम्म ... मैंने बस अपने स्प्रिंट एलजी ऑप्टिमस फोन पर डिफ़ॉल्ट "हैलोवर्ल्ड" गतिविधि (यानी, SHOW_FORCED कोड सहित) के साथ यह कोशिश की और यह अपेक्षा के अनुसार काम किया। क्या यह संभव है कि सुविधा डिवाइस (ओएस स्थापित) निर्भर है ?? जब मैं घर जाता हूं तो मैं अपने अन्य उपकरणों (एचटीसी, जी 2 और माई टच) पर फिर से परीक्षण करूंगा। – mobibob

+0

कृपया मेरा जवाब यहां देखें, मैंने नीचे दी गई सभी तकनीकों का प्रयास किया है, लेकिन यह काम करता है: http://stackoverflow.com/a/37529370/3900270 – strangetimes

उत्तर

15

यह इतना सूक्ष्म है, कि यह आपराधिक है। यह उन फ़ोनों पर काम करता है जो पर एक कठिन, स्लाइड-आउट कीबोर्ड है। हार्ड कॉल वाले फ़ोन स्वचालित रूप से इस कॉल के साथ नहीं खुलेंगे। मेरे एलजी और पुराने नेक्सस वन में कीबोर्ड नहीं है - इसलिए, गतिविधि शुरू होने पर सॉफ्ट-कीबोर्ड खुलता है (यही वह है जो मैं चाहता हूं), लेकिन माई टच और एचटीसी जी 2 फोन जिनमें स्लाइड-आउट कीबोर्ड हैं, नरम नहीं खोलते हैं कुंजीपटल जब तक मैं हार्ड कीबोर्ड बंद संपादन क्षेत्र को स्पर्श नहीं करता।

+1

नोट: मैंने एडिटटेक्स्ट और इनपुट मोड मैनेजर के साथ बहुत प्रयोग किया है सॉफ्ट-कीबोर्ड को खोलने के लिए मजबूर करने के प्रयास में जब डिवाइस को कोई सफलता के बिना हार्ड कीबोर्ड होता है। – mobibob

+0

किसी भी व्यक्ति के लिए विजुअल स्टूडियो में एक्समेरिन विकास करने के लिए, एवीडी प्रबंधक में आप एवीडी संपादित कर सकते हैं और "हार्डवेयर कीबोर्ड मौजूद" लेबल वाली एक सेटिंग है। इसे अनचेक करने से नरम इनपुट प्रदर्शित हो जाएगा। –

18

अरे मुझे आशा है कि आप अभी भी उत्तर की तलाश कर रहे हैं जैसा कि मैंने अपने कोड का परीक्षण करते समय पाया था। android - show soft keyboard on demand

15

यह कठिन कीबोर्ड के साथ एक फोन पर मेरे साथ काम किया:

editText1.requestFocus(); 
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
      imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0); 
+1

बढ़िया मुझे अनुरोध फोकस() था जो पहली बार दिखाए जाने वाले कीबोर्ड को रोक रहा था। –

20

जब गतिविधि की शुरूआत ऐसा लगता है

InputMethodManager imm = (InputMethodManager)_context.getSystemService(Context.INPUT_METHOD_SERVICE); 

imm.toggleSoftInput(0, 0); 

यहाँ मेरे सवाल है कि उत्तर दिया गया है: यहाँ कोड है कि कुंजीपटल शुरू में प्रदर्शित होता है लेकिन किसी और चीज से छुपाया जाता है, क्योंकि निम्नलिखित काम करता है (लेकिन वास्तव में एक गंदे काम है):

सबसे पहले विधि

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
editText.postDelayed(new Runnable() 
{ 
    @Override 
    public void run() 
    { 
     editText.requestFocus(); 
     imm.showSoftInput(editText, 0); 
    } 
}, 100); 

दूसरी विधि

onCreate में गतिविधि पर उसे लॉन्च करने के

new Handler().postDelayed(new Runnable() { 
    @Override 
    public void run() 
    { 
    // InputMethodManager inputMethodManager=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
    // inputMethodManager.toggleSoftInputFromWindow(EnterYourViewHere.getApplicationWindowToken(), InputMethodManager.SHOW_FORCED, 0); 

     if (inputMethodManager != null) 
     { 
      inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED,0); 
     } 
    } 
}, 200); 

तीसरा विधि जोड़ें प्रकट में गतिविधि टैग को दिया कोड पैदा करते हैं। यह लॉन्च पर कीबोर्ड दिखाएगा, और अपनी इच्छा दृश्य पर पहला फोकस सेट करेगा।

android:windowSoftInputMode="stateVisible" 
+1

मुझे एक ही समस्या है। 'ShowSoftInput()' को कॉल करने के तुरंत बाद कोई दृश्य परिणाम नहीं होता है, लेकिन इसे देरी पर पोस्ट करने से कुंजीपटल सही तरीके से प्रदर्शित होता है। मैंने शुरू में सोचा था, आपके जैसे, यह दिखाया जा रहा था और फिर तुरंत किसी और चीज से छिपा हुआ था। हालांकि थोड़ा खोदने के बाद, मैंने पाया कि मैं 'परिणाम रिसीवर' में जा सकता हूं और परिणामों को लॉग कर सकता हूं। जब मैं देरी पर 'showSoftInput() 'पोस्ट करता हूं, तो मेरे रिसीवर पर लौटाया गया परिणाम कोड' RESULT_SHOWN' है। जब मैं देरी का उपयोग नहीं करता, तो मेरा रिसीवर बिल्कुल नहीं कहा जाता है। अब मुझे छुपा होने की बजाय संदेह है, यह किसी कारण से इसे बिल्कुल नहीं दिखा रहा है। –

+1

धन्यवाद आदमी। कुंजीपटल के साथ समस्या को ठीक करते समय पहली विधि का उपयोग पहली बार एक संवाद खंड (एक संपादन टेक्स्ट के साथ) लॉन्च नहीं करता है। – Ugo

+3

'पोस्टडेलेड' बनाम कॉल करने के लिए एक और अप-वोट'पोस्ट' - कुछ अन्य डिफ़ॉल्ट, छिपी कार्यक्षमता की संभावना है जो कुंजीपटल को पहले छिपाने का कारण बन रहा है। कीबोर्ड को दिखाना और छिपाना अस्तित्व में सबसे व्यापक रूप से टूटा हुआ एपीआई है। – rmirabelle

1

मेरे कोड में टॉगल था लेकिन पोस्ट नहीं किया गया था। मैंने सफलता के बिना showSoftInput के लिए पोस्ट किया गया था और मैंने आपके सुझाए गए समाधान की कोशिश की है। जब तक मैंने देरी का समय बढ़ाने का फैसला नहीं किया, तब तक मैं इसे एक और असफल संभावित समाधान के रूप में त्यागने वाला था। यह मेरे लिए 200 एमएस तक सभी तरह से काम करता है जिस बिंदु पर यह काम नहीं करता है, कम से कम भौतिक फोन पर नहीं।इससे पहले कि आप खराब एंड्रॉइड डेवलपर्स इस जवाब को कुचलने से पहले, सफल समाधान के लिए देरी को उठाने का प्रयास करें। यह पुराने धीमी फोन के लिए थोड़ा जोड़ने के लिए भुगतान कर सकता है। धन्यवाद ढेर, इस पर घंटों तक काम कर रहा था।

4

यह उत्तर शायद देर हो चुकी है लेकिन यह मेरे लिए पूरी तरह से काम करती है। हो सकता है कि यह किसी को :)

public void showSoftKeyboard(View view) { 
    if (view.requestFocus()) { 
     InputMethodManager imm = (InputMethodManager) 
       getSystemService(Context.INPUT_METHOD_SERVICE); 
     boolean isShowing = imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT); 
     if (!isShowing) 
      getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); 
    } 
} 

निर्भर करता है पर आप की जरूरत है, तो आप अन्य झंडे

InputMethodManager.SHOW_FORCED 
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); 
1

शीतल कीबोर्ड एक बड़ी समस्या दिखा रहा है उपयोग कर सकते हैं मदद करता है। मैंने अंतिम निष्कर्ष पर आने के लिए बहुत कुछ खोजा। इस जवाब जो सुराग के एक नंबर दिया करने के लिए धन्यवाद: https://stackoverflow.com/a/16882749/5903344

समस्या:

आम तौर पर हम जैसे ही हम विचारों को प्रारंभ के रूप में showSoftInput कहते हैं। क्रियाकलापों में, यह ज्यादातर क्रेटमेंट्स ऑनक्रेट व्यू में क्रेट पर है। कुंजीपटल दिखाने के लिए, आईएमएम को फोकस किए गए दृश्य को सक्रिय के रूप में रखना होगा। इसे आईएमएम की एक्टिव (व्यू) विधि का उपयोग करके चेक किया जा सकता है। अगर हम शोसॉफ्ट इनपुट को कॉल करते समय देखते हैं, तो एक अच्छा मौका है कि दृश्य आईएमएम के लिए सक्रिय नहीं होगा। यही कारण है कि कभी-कभी 50-100 एमएस शो में सॉफ़्ट इनपुट विफल हो जाता है। हालांकि, यह अभी भी गारंटी नहीं देता है कि 100 एमएस के बाद दृश्य सक्रिय हो जाएगा। तो मेरी समझ में, यह फिर से एक हैक है।

समाधान:

मैं निम्नलिखित वर्ग का उपयोग करें। कीबोर्ड को सफलतापूर्वक दिखाए जाने तक यह हर 100 एमएस चल रहा रहता है। यह प्रत्येक पुनरावृत्ति में विभिन्न जांच करता है। कुछ चेक रननेबल को रोक सकते हैं, कुछ इसे 100 एमएस के बाद पोस्ट करते हैं।

public class KeyboardRunnable extends Runnable 
{ 
    // ----------------------- Constants ----------------------- // 
    private static final String TAG = "KEYBOARD_RUNNABLE"; 

    // Runnable Interval 
    private static final int INTERVAL_MS = 100; 

    // ----------------------- Classes ---------------------------// 
    // ----------------------- Interfaces ----------------------- // 
    // ----------------------- Globals ----------------------- // 
    private Activity parentActivity = null; 
    private View targetView = null; 

    // ----------------------- Constructor ----------------------- // 
    public KeyboardRunnable(Activity parentActivity, View targetView) 
    { 
     this.parentActivity = parentActivity; 
     this.targetView = targetView; 
    } 

    // ----------------------- Overrides ----------------------- // 
    @Override 
    public void run() 
    { 
     // Validate Params 
     if ((parentActivity == null) || (targetView == null)) 
     { 
      Dbg.error(TAG, "Invalid Params"); 
      return; 
     } 

     // Get Input Method Manager 
     InputMethodManager imm = (InputMethodManager) parentActivity.getSystemService(Context.INPUT_METHOD_SERVICE); 

     // Check view is focusable 
     if (!(targetView.isFocusable() && targetView.isFocusableInTouchMode())) 
     { 
      Dbg.error(TAG, "Non focusable view"); 
      return; 
     } 
     // Try focusing 
     else if (!targetView.requestFocus()) 
     { 
      Dbg.error(TAG, "Cannot focus on view"); 
      Post(); 
     } 
     // Check if Imm is active with this view 
     else if (!imm.isActive(targetView)) 
     { 
      Dbg.error(TAG, "IMM is not active"); 
      Post(); 
     } 
     // Show Keyboard 
     else if (!imm.showSoftInput(targetView, InputMethodManager.SHOW_IMPLICIT)) 
     { 
      Dbg.error(TAG, "Unable to show keyboard"); 
      Post(); 
     } 
    } 

    // ----------------------- Public APIs ----------------------- // 
    public static void Hide(Activity parentActivity) 
    { 
     if (parentActivity != null) 
     { 
      InputMethodManager imm = (InputMethodManager) parentActivity.getSystemService(Context.INPUT_METHOD_SERVICE); 
      imm.hideSoftInputFromWindow(parentActivity.findViewById(android.R.id.content).getWindowToken(), 0); 
     } 
     else 
     { 
      Dbg.error(TAG, "Invalid params to hide keyboard"); 
     } 
    } 

    // ----------------------- Private APIs ----------------------- // 
    protected void Post() 
    { 
     // Post this aftr 100 ms 
     handler.postDelayed(this, INTERVAL_MS); 
    } 
} 

इसका उपयोग करने के लिए, बस इस कक्षा का एक उदाहरण बनाएं। इसे मूल गतिविधि और targetView पास करें जिसमें कीबोर्ड इनपुट होगा और बाद में फ़ोकस होगा। फिर एक हैंडलर का उपयोग कर उदाहरण पोस्ट करें।