অ্যান্ড্রয়েড: এডিটেক্সটটিতে ফোকাস থাকলে স্বয়ংক্রিয়ভাবে নরম কীবোর্ড প্রদর্শন করুন


340

আমি একটি ইনপুট বাক্স ব্যবহার করে দেখাচ্ছে AlertDialogEditTextডায়ালগ ভিতরে নিজেই স্বয়ংক্রিয়ভাবে ফোকাস যখন আমি কল AlertDialog.show(), কিন্তু নরম কীবোর্ড স্বয়ংক্রিয়ভাবে দেখানো হয় না।

ডায়ালগটি প্রদর্শিত হলে আমি কীভাবে নরম কীবোর্ড স্বয়ংক্রিয়ভাবে দেখাব? (এবং কোনও শারীরিক / হার্ডওয়্যার কীবোর্ড নেই)। যখন আমি বিশ্বব্যাপী অনুসন্ধানের জন্য অনুসন্ধান বোতাম টিপবো তখন স্নিগ্ধ কীবোর্ড স্বয়ংক্রিয়ভাবে প্রদর্শিত হবে is


1
নীচে টেডের মন্তব্য অনুসারে এটি স্বয়ংক্রিয়ভাবে হওয়া উচিত । প্রথম যে পরীক্ষা!
চিজমিস্টার

এই উত্তরটি সবচেয়ে সহজ এবং কাজ করে: স্ট্যাকওভারফ্লো.com
8018630


1
আমি কয়েক বছর ধরে এই উত্তরটিতে ফিরে এসেছি। এটি সর্বদা একটি ডায়ালগের অভ্যন্তরে থাকে যা আমার এই সমস্যাটি হয়, কখনও খণ্ডিত বা ক্রিয়াকলাপ হয় না।
tir38

উত্তর:


304

আপনি উপর নজরদারি শ্রোতা তৈরি করতে পারেন EditTextউপর AlertDialog, তারপর পেতে AlertDialogএর Window। সেখান থেকে কল করে আপনি নরম কীবোর্ড শো করতে পারেন setSoftInputMode

final AlertDialog dialog = ...;

editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        }
    }
});

5
সতর্কতা ডায়ালগ.বিল্ডার ব্যবহার করে আমি কীভাবে এটি করব? ... চূড়ান্ত সতর্কতা ডায়ালগ.বিল্ডার সতর্কতা = নতুন সতর্কতা ডায়ালগ.বিল্ডার (মেইন.ইথিস);
স্টিফেন

6
@ স্টিফেন আপনি বিল্ডারের কাছ থেকে ডায়ালগটি ব্যবহার করে final AlertDialog dialog = builder.create()এবং তারপরে showবিল্ডারের পরিবর্তে ডায়ালগটি পেতে পারেন ।
tidbeck

30
আমি আমার উপরের মন্তব্যগুলি পুনরায় প্রত্যক্ষ করেছি আমি জানতে পেরেছি যে আপনি যদি ফোকাসটি সঠিকভাবে পেতে না পারেন তবে আপনার এক্সএমএলটি একবার দেখুন! আপনি যদি সেখানে <requestFocus> </requestFocus> ট্যাগটি দেখেন - এটি সরিয়ে দিন। দেখে মনে হচ্ছে যে ট্যাগটি সম্পাদনা পাঠকে ফোকাস দেবে এবং তারপরে আপনার শ্রোতাটিকে এডিট টেক্সটটিতে ইতিমধ্যে ফোকাস দেওয়ার কারণে বরখাস্ত করা হবে না।
টেড

11
ডিভাইসে একটি হার্ডওয়্যার কীবোর্ড থাকলে আপনি কীভাবে এটি করবেন না? মনে হয় এটি ব্যবহারকারীর জন্য বিরক্তিকর।
এমএক্সসিএল

8
কেন এটি এসডিকে ডিফল্ট আচরণ নয় তা আমি সত্যিই বুঝতে পারি না। পাঠ্য ইনপুট প্রয়োজন এমন একটি দৃশ্য যদি একটি ঝলক দেওয়া কার্সার দেখায়, তবে কেউ কেন পাঠ্য ইনপুটটিতে কীবোর্ডটি দেখতে চাইবে না? এটি আমার কাছে কোনও ইউএক্সের পক্ষে খুব খারাপ লাগছে
ক্রিশ্চান গার্সিয়া

240

কীবোর্ড ব্যবহার দেখানোর জন্য:

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);

কীবোর্ডের ব্যবহারটি লুকানোর জন্য:

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(),0); 

3
এটি বিশেষত ভাল কাজ করে যখন আপনি ভিজিবল এবং গনের মধ্যে আপনার বিন্যাসে একটি দৃশ্যের দৃশ্যমানতা টগল করার উপর ভিত্তি করে নরম কীবোর্ডটি প্রদর্শন / আড়াল করতে চান।
প্যাসিফিকস্কি

38
আমি পরিবর্তে SHOW_IMPLICIT পতাকা ব্যবহার করার পরামর্শ দেব, কারণ এটির ক্রিয়াকলাপ বা অ্যাপ্লিকেশন পরিবর্তন করা প্রত্যাশা অনুযায়ী কীবোর্ডটিকে স্বয়ংক্রিয়ভাবে আড়াল করবে।
drspaceboo

6
@drspaceboo SHOW_IMPLICIT ব্যবহার করা আমার পক্ষে মোটেও কাজ করে না, আমাকে SHOW_FORCED ব্যবহার করতে হবে, কেন তা নিশ্চিত নয় ...
ইয়োন হারকিউট

1
উপরের কোডটি কখন চালানো উচিত? আমি আমার লেআউটটিকে এর পিতামাতার সাথে যুক্ত করার পরেই তা করার চেষ্টা করেছি। কাজ হয়নি। লেআউটটি কিছু সময়ের জন্য থাকার পরে যদি আমি এটি করি তবে এটি কার্যকর হয়েছিল। তাহলে কি এমন কলব্যাক আছে যা আমাকে বলবে "আপনি যদি এখনই কীবোর্ডটি দেখানোর চেষ্টা করেন, এটি আসলে কাজ করবে"?
উইলিয়াম জকুশ

1
টগলসফট ইনপুট (ইনপুটমেথডম্যানেজ। SHOW_FORCED, 0) নরম কীবোর্ড টগল করে। আপনি যদি কীবোর্ডটি উপস্থিত হয়েছে কিনা তা নিশ্চিত করতে চান তবে আপনি পরিবর্তে im.showSoftInput (দেখুন, ইনপুটমেথডম্যানেজার.শ SHO_IMPLICIT) ব্যবহার করতে পারেন, যেখানে ভিউটি ইনপুটটি পাবে।
পিজে_ফিনেগান

111

ডায়ালগটি তৈরি করার পরে আপনি একটি সফট কীবোর্ডের অনুরোধ করতে পারেন (এসডিকে পরীক্ষা করুন - r20)

// create dialog
final AlertDialog dialog = ...; 

// request keyboard   
dialog.getWindow().setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

যে কারও জন্য অবাক হওয়ার কথা, কোনও হার্ডওয়্যার কীবোর্ড সংযুক্ত থাকলে এই পদ্ধতিটি নরম কীবোর্ডটি খুলবে না। আমি সবেমাত্র একটি ইউএসবি অন-দ্য-গো তারের মাধ্যমে পরীক্ষা করেছি। পারফেক্ট!
13rac1

এটি আমার জন্য কিছু করে না।
জনিটেক্স

আমার কোনও হার্ডওয়্যার কীবোর্ড নেই। হতে পারে কনফিগারেশন (?)
জননিটেক্স

25

আমার একই সমস্যা ছিল এবং এটি নীচের কোড দিয়ে সমাধান করেছি। হার্ডওয়ার কীবোর্ড সহ কোনও ফোনে এটি কীভাবে আচরণ করবে তা আমি নিশ্চিত নই।

// TextEdit
final EditText textEdit = new EditText(this);

// Builder
AlertDialog.Builder alert = new AlertDialog.Builder(this);
alert.setTitle("Enter text");
alert.setView(textEdit);

alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        String text = textEdit.getText().toString();
        finish();
    }
});

alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        finish();
    }
});

// Dialog
AlertDialog dialog = alert.create();
dialog.setOnShowListener(new OnShowListener() {

    @Override
    public void onShow(DialogInterface dialog) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(textEdit, InputMethodManager.SHOW_IMPLICIT);
    }
});

dialog.show();

এটি ডায়ালগ ক্লাসের এপিআই স্তরের 8 পর্যায়ে রয়েছে
টিডবেক

অবশ্যই পরে অপসারণ করা হবে: /
জেসেক কোয়েসিয়

@ সাইলিয়ান এটি ডকুমেন্টেশনে এখনও ডায়ালগ.সেটঅনশো লিসটার ()
টিডবেক


18
<activity
    ...
    android:windowSoftInputMode="stateVisible" >
</activity>

অথবা

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

অনেক সাথীর ধন্যবাদ, এটি দুর্দান্ত ছিল, প্রকৃত আমি উভয়কেই আমার সমস্যা সমাধানের জন্য ব্যবহার করেছিলাম, আমার এমন পরিস্থিতি হয়েছিল যেখানে ব্যবহারকারী যদি অ্যাড মোডে থাকে, তবে ক্রিয়াকলাপ শুরুর সময় কী-বোর্ডটি দেখাতে হবে এবং আপডেট মোডের জন্য কোনও কীবোর্ডের প্রয়োজন ছিল না গতানুগতিক. তাই আমি প্রকাশিত ক্রিয়াকলাপে আমি সেট করেছি stateHiddenএবং যখন সনাক্ত করি ব্যবহারকারী নতুন আইটেম তৈরি করছে তখন আমি আপনার উল্লিখিত কোড লাইনটি ব্যবহার করে কীবোর্ড প্রদর্শন করেছি। :) আবার ধন্যবাদ।
পিএইচপি অ্যাভেঞ্জার

আমি একটি 'getWindow () সমাধান করতে পারি না' বার্তাটি পাই। আমি 'এটি' দেওয়ার চেষ্টা করেছি। এবং এর আগে অন্যান্য জিনিস। আমি এডিটেক্সট ব্যবহার না করেই কীবোর্ডটি পেতে চাই, কেবলমাত্র পর্দার একটি নির্দিষ্ট অংশে ক্লিক করে।
অ্যান্ড্রয়েড কোডার

1
@ অ্যান্ড্রয়েডকোডার, এটি ক্রিয়াকলাপের একটি অংশ, তাই এর মতো কিছু যুক্ত করুন ((Activity) context).getWindow()....
কুলমাইন্ড

15

অন্যান্য উত্তরের কোডগুলির স্নিপেটগুলি কাজ করে, তবে কোডগুলিতে সেগুলি কোথায় রাখবেন তা সর্বদা স্পষ্ট নয়, বিশেষত যদি আপনি কোনও ব্যবহার করছেন AlertDialog.Builderএবং অফিসিয়াল ডায়ালগ টিউটোরিয়ালটি অনুসরণ করেন কারণ এটি ব্যবহার করে না final AlertDialog ...বা alertDialog.show()

alertDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

তার থেকে ভাল

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);

কারণ SOFT_INPUT_STATE_ALWAYS_VISIBLE যদি এডিট টেক্সট থেকে ফোকাসটি স্যুইচ করে তবে কীবোর্ডটি লুকিয়ে রাখবে, যেখানে SHOW_FORCED কীবোর্ডকে স্পষ্টভাবে প্রত্যাখ্যান না করা পর্যন্ত প্রদর্শন করবে, এমনকি যদি ব্যবহারকারী হোমস্ক্রিনে ফিরে আসে বা সাম্প্রতিক অ্যাপ্লিকেশনগুলি প্রদর্শন করে।

নীচে XML- এ সংজ্ঞায়িত একটি সম্পাদনা পাঠ্য সহ একটি কাস্টম বিন্যাস ব্যবহার করে তৈরি একটি অ্যালার্টডায়ালগের জন্য কোড কাজ করছে। এটি "গো" কী রাখতে কীবোর্ডটি সেট করে এবং এটি ইতিবাচক বোতামটি ট্রিগার করতে দেয়।

alert_dialog.xml:

<RelativeLayout
android:id="@+id/dialogRelativeLayout"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content" >

    <!-- android:imeOptions="actionGo" sets the keyboard to have a "go" key instead of a "new line" key. -->
    <!-- android:inputType="textUri" disables spell check in the EditText and changes the "go" key from a check mark to an arrow. -->
    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:layout_marginLeft="4dp"
        android:layout_marginRight="4dp"
        android:layout_marginBottom="16dp"
        android:imeOptions="actionGo"
        android:inputType="textUri"/>

</RelativeLayout>

AlertDialog.java:

import android.app.Activity;
import android.app.Dialog;
import android.content.DialogInterface;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatDialogFragment;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.widget.EditText;

public class CreateDialog extends AppCompatDialogFragment {
    // The public interface is used to send information back to the activity that called CreateDialog.
    public interface CreateDialogListener {
        void onCreateDialogCancel(DialogFragment dialog);    
        void onCreateDialogOK(DialogFragment dialog);
    }

    CreateDialogListener mListener;

    // Check to make sure that the activity that called CreateDialog implements both listeners.
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            mListener = (CreateDialogListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString() + " must implement CreateDialogListener.");
        }
    }

    // onCreateDialog requires @NonNull.
    @Override
    @NonNull
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getActivity());
        LayoutInflater customDialogInflater = getActivity().getLayoutInflater();

        // Setup dialogBuilder.
        alertDialogBuilder.setTitle(R.string.title);
        alertDialogBuilder.setView(customDialogInflater.inflate(R.layout.alert_dialog, null));
        alertDialogBuilder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                mListener.onCreateDialogCancel(CreateDialog.this);
            }
        });
        alertDialogBuilder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                mListener.onCreateDialogOK(CreateDialog.this);
            }
        });

        // Assign the resulting built dialog to an AlertDialog.
        final AlertDialog alertDialog = alertDialogBuilder.create();

        // Show the keyboard when the dialog is displayed on the screen.
        alertDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

        // We need to show alertDialog before we can setOnKeyListener below.
        alertDialog.show();

        EditText editText = (EditText) alertDialog.findViewById(R.id.editText);

        // Allow the "enter" key on the keyboard to execute "OK".
        editText.setOnKeyListener(new View.OnKeyListener() {
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                // If the event is a key-down event on the "enter" button, select the PositiveButton "OK".
                if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) {
                    // Trigger the create listener.
                    mListener.onCreateDialogOK(CreateDialog.this);

                    // Manually dismiss alertDialog.
                    alertDialog.dismiss();

                    // Consume the event.
                    return true;
                } else {
                    // If any other key was pressed, do not consume the event.
                    return false;
                }
            }
        });

        // onCreateDialog requires the return of an AlertDialog.
        return alertDialog;
    }
}

11

ঠিক আছে, এটি একটি দুর্দান্ত পুরানো পোস্ট, এখনও কিছু যুক্ত করার আছে।
এটি 2 টি সহজ পদ্ধতি যা আমাকে কীবোর্ড নিয়ন্ত্রণে রাখতে সহায়তা করে এবং এগুলি কেবল নিখুঁতভাবে কাজ করে:

কীবোর্ড প্রদর্শন করুন

public void showKeyboard() {
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    View v = getCurrentFocus();
    if (v != null)
        imm.showSoftInput(v, 0);
}

কীবোর্ড লুকান

public void hideKeyboard() {
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    View v = getCurrentFocus();
    if (v != null)
        imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}

কী getCurrentFocus()?
কুলমাইন্ড

আমি দেখছি, এটি একটি এর একটি পদ্ধতি Activity
কুলমাইন্ড

10

আমাকে ইউকু সমাধানের জন্য কিছু অতিরিক্ত তথ্য নির্দেশ করুক, কারণ এই কাজটি করা আমার পক্ষে কঠিন ছিল! আমি কীভাবে আমার সতর্কতা ডায়ালগ.বিল্ডার থেকে সতর্কতা ডায়ালগ বস্তুটি পেতে পারি? ঠিক আছে, এটি আমার alert.show()মৃত্যুদণ্ডের ফলাফল :

final AlertDialog.Builder alert = new AlertDialog.Builder(getActivity());
final EditText input = new EditText(getActivity());
alert.setView(input);

// do what you need, like setting positive and negative buttons...

final AlertDialog dialog = alert.show();

input.setOnFocusChangeListener(new OnFocusChangeListener() {
   @Override
   public void onFocusChange(View v, boolean hasFocus) {
      if(hasFocus) {
         dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
      }
   }
});

এটি গ্রহণযোগ্য উত্তর হওয়া উচিত।
ক্রিশ্চিয়ানো কোয়েলহো

7

এই আলোচনাটি একবার দেখুন যা আইএমই ম্যানুয়ালি লুকিয়ে রাখছে এবং দেখায়। তবে আমার অনুভূতিটি হ'ল যদি কোনও EditTextফোকাসড আইএমই আনতে না পারে তবে এটি আপনি বা AlertDialog.show()আপনার OnCreate()অন্য কোনও পদ্ধতিতে কল করছেন যা স্ক্রিনটি উপস্থাপনের আগে উত্সাহিত হয়েছিল। এটিকে স্থানান্তর করা এ OnPostResume()ক্ষেত্রে ঠিক করা উচিত আমি বিশ্বাস করি।


6

হ্যাঁ আপনি setOnFocusChangeListenerএটি করতে পারেন আপনাকে সাহায্য করবে।

editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        }
    }
});

4

আমি জানি যে আমি এই প্রশ্নটি পুরানো বলে মনে করি একটি সম্পাদনা পাঠ্যের জন্য কীবোর্ড দেখানোর জন্য একটি এক্সটেনশন ফাংশন ব্যবহার করা একটি দুর্দান্ত উপায়

সম্পাদনা পাঠের জন্য কীবোর্ড দেখানোর জন্য আমি যে পদ্ধতিটি ব্যবহার করি তা এখানে।

কোটলিন কোড: কেবল কল করতে হবেedittext.showKeyboard()

fun EditText.showKeyboard() {
  post {
    requestFocus()
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
  }
}

জাভা কোড:

public static void showKeyboard(EditText editText) {
    editText.post(new Runnable() {
      @Override
      public void run() {
        editText.requestFocus();
        InputMethodManager imm = (InputMethodManager) editText.getContext()
            .getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
      }
    });
  }

3

যদি কেউ পান:

ক্রিয়াকলাপ টাইপ থেকে অ স্থিতিক পদ্ধতি getSystemService (স্ট্রিং) এর স্থিতিশীল রেফারেন্স তৈরি করতে পারে না

সিস্টেমে সার্ভিস কলটিতে প্রসঙ্গ যুক্ত করার চেষ্টা করুন ।

সুতরাং

InputMethodManager imm = 
(InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);

1

মূল প্রশ্নটি ডায়ালগগুলি নিয়ে উদ্বেগ প্রকাশ করে এবং আমার সম্পাদনা পাঠ্য নিয়মিত দর্শন on যাইহোক, আমি সন্দেহ করি এটি আপনার বেশিরভাগের জন্যও কাজ করা উচিত। সুতরাং এখানে আমার জন্য কী কাজ করা হয় (উপরের প্রস্তাবিত সর্বোচ্চ রেটযুক্ত পদ্ধতিটি আমার পক্ষে কিছুই করেনি)। এখানে একটি কাস্টম এডিটভিউ রয়েছে যা এটি করে (সাবক্লাসিং প্রয়োজনীয় নয়, তবে আমি আমার লক্ষ্যগুলির জন্য এটি সুবিধাজনক বলে মনে করি যেহেতু দৃশ্যটি দৃশ্যমান হওয়ার সাথে সাথে আমি ফোকাসটিও দখল করতে চেয়েছিলাম)।

এটি মূলত টিডবিক্স উত্তরের মতোই। আমি শূন্যতম ভোট পেয়েছি বলে আমি তার উত্তরটি মোটেও খেয়াল করিনি। তারপরে আমি কেবল তার পোস্টে মন্তব্য করতে চলেছি, তবে এটি খুব দীর্ঘ হবে, সুতরাং যাইহোক এই পোস্টটি করা শেষ করেছি। টিডব্যাক নির্দেশ করে যে কীবোর্ডযুক্ত ডিভাইসগুলির সাথে এটি কীভাবে কাজ করে সে সম্পর্কে তিনি নিশ্চিত নন। আমি নিশ্চিত করতে পারি যে উভয় ক্ষেত্রেই আচরণটি একই রকম বলে মনে হচ্ছে। এটি এমন যে পোর্ট্রেট মোডে সফ্টওয়্যার কীবোর্ড পপ আপ হয়ে যায় এবং ল্যান্ডস্কেপে এটি হয় না। শারীরিক কীবোর্ড স্লিট আউট হওয়া বা না থাকা আমার ফোনে কোনও পার্থক্য করে না।

কারণ, আমি ব্যক্তিগতভাবে আচরণ একটু বেখাপ্পা আমি ব্যবহার নির্বাচিত পাওয়া যায়নি: InputMethodManager.SHOW_FORCED। এটি যেমন কাজ করতে চেয়েছিল তেমন কাজ করে। ওরিয়েন্টেশন নির্বিশেষে কীবোর্ডটি দৃশ্যমান হয়ে ওঠে, তবে, কমপক্ষে আমার ডিভাইসে এটি হার্ডওয়ার কীবোর্ডটি স্লাইড হয়ে থাকলে পপ আপ হয় না।

import android.app.Service;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;

public class BringOutTheSoftInputOnFocusEditTextView extends EditText {

    protected InputMethodManager inputMethodManager;

    public BringOutTheSoftInputOnFocusEditTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    public BringOutTheSoftInputOnFocusEditTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public BringOutTheSoftInputOnFocusEditTextView(Context context) {
        super(context);
        init();
    }

    private void init() {
        this.inputMethodManager = (InputMethodManager)getContext().getSystemService(Service.INPUT_METHOD_SERVICE);
        this.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (hasFocus) {
                    BringOutTheSoftInputOnFocusEditTextView.this.inputMethodManager.showSoftInput(BringOutTheSoftInputOnFocusEditTextView.this, InputMethodManager.SHOW_FORCED);
                }
            }
        });
    }

    @Override
    protected void onVisibilityChanged(View changedView, int visibility) {
        super.onVisibilityChanged(changedView, visibility);
        if (visibility == View.VISIBLE) {
            BringOutTheSoftInputOnFocusEditTextView.this.requestFocus();
        }
    }

}

1

সমস্যাটি মনে হচ্ছে যেহেতু আপনি পাঠ্যটি প্রবেশ করানোর জায়গাটি গোপনে লুকানো আছে (বা নেস্টেড বা অন্য কিছু), সতর্কতা ডায়ালগ স্বয়ংক্রিয়ভাবে পতাকাটি সেট করছে WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IMবা WindowManager.LayoutParams.FLAG_NOT_FOCUSABLEযাতে জিনিসগুলি কোনও প্রদর্শন করার জন্য কোনও নরম ইনপুট ট্রিগার না করে।

এটি ঠিক করার উপায়টি হল নিম্নলিখিতগুলি যুক্ত করা:

(...)
// Create the dialog and show it
Dialog dialog = builder.create()
dialog.show();

// After show (this is important specially if you have a list, a pager or other view that uses a adapter), clear the flags and set the soft input mode
dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

1

চেষ্টা করুন এবং ব্যবহার করুন:

editText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);

1

কীবোর্ড প্রদর্শন করতে, আমার জন্য, আমাকে নিম্নলিখিতগুলি করতে হয়েছিল

অ্যান্ড্রয়েড টেক্সটফিল্ড: প্রোগ্রামিকভাবে ফোকাস + নরম ইনপুট সেট করুন

মূলত সমাধানটি নিম্নলিখিত

@Override
public void onResume() {
    super.onResume();
    //passwordInput.requestFocus(); <-- that doesn't work
    passwordInput.postDelayed(new ShowKeyboard(), 325); //250 sometimes doesn't run if returning from LockScreen
}

কোথায় ShowKeyboardআছে

private class ShowKeyboard implements Runnable {
    @Override
    public void run() {
        passwordInput.setFocusableInTouchMode(true);
        //passwordInput.requestFocusFromTouch(); //this gives touch event to launcher in background -_-
        passwordInput.requestFocus();
        getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        ((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(passwordInput, 0);
    }
}

একটি সফল ইনপুট পরে, আমি কীবোর্ডটি লুকিয়ে রেখেছি তাও নিশ্চিত করি

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE))
                    .hideSoftInputFromWindow(getView().getWindowToken(), 0);

1

আপনার ইউটিল শ্রেণিতে এই পদ্ধতিগুলি রাখুন এবং যে কোনও জায়গায় ব্যবহার করুন।

Kotlin

fun hideKeyboard(activity: Activity) {
    val view = activity.currentFocus
    val methodManager = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    assert(view != null)
    methodManager.hideSoftInputFromWindow(view!!.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
}

private fun showKeyboard(activity: Activity) {
    val view = activity.currentFocus
    val methodManager = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    assert(view != null)
    methodManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
}

জাভা

public static void hideKeyboard(Activity activity) {
    View view = activity.getCurrentFocus();
    InputMethodManager methodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    assert methodManager != null && view != null;
    methodManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}

private static void showKeyboard(Activity activity) {
    View view = activity.getCurrentFocus();
    InputMethodManager methodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    assert methodManager != null && view != null;
    methodManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
}

1

আমি আগ্রহী আগ্রহী যদি কেউ কোটলিন-এস্কে এক্সটেনশন ফাংশন তৈরি করে

fun Activity.hideKeyBoard() {
    val view = this.currentFocus
    val methodManager = this.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    assert(view != null)
    methodManager.hideSoftInputFromWindow(view!!.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
}

fun Activity.showKeyboard() {
    val view = this.currentFocus
    val methodManager = this.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    assert(view != null)
    methodManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
}

0

এটি আপনার জন্য ভাল নমুনা:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <ScrollView
        android:id="@+id/scrollID"
        android:layout_width="fill_parent"
        android:layout_height="0dip"
        android:layout_weight="1" >

        <LinearLayout
            android:id="@+id/test"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" >
        </LinearLayout>
    </ScrollView>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:baselineAligned="true"
        android:orientation="horizontal"
        android:paddingBottom="5dp"
        android:paddingLeft="5dp"
        android:paddingRight="5dp"
        android:weightSum="1" >

        <EditText
            android:id="@+id/txtInpuConversation"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="0.5"
            android:hint="@string/edt_Conversation" >

            <requestFocus />
        </EditText>

        <Button
            android:id="@+id/btnSend"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="0.5"
            android:text="@string/btn_Conversation" />
    </LinearLayout>

</LinearLayout>

0

কেন এই উত্তর - কারণ উপরের সমাধানটি আপনার কীবোর্ডটি দেখায় তবে আপনি অন্য যে কোনও জায়গায় ক্লিক করলে এটি বিলুপ্ত হবে না EditText। সুতরাং EditTextফোকাস হারাতে গেলে কী-বোর্ডটি অদৃশ্য হয়ে যাওয়ার জন্য আপনাকে কিছু করতে হবে ।

আপনি নিম্নলিখিত পদক্ষেপগুলি দ্বারা এটি অর্জন করতে পারেন:

  1. নিম্নলিখিত বৈশিষ্ট্যগুলি যুক্ত করে প্যারেন্ট ভিউটিকে (আপনার ক্রিয়াকলাপের সামগ্রী দর্শন) ক্লিকযোগ্য এবং ফোকাসযোগ্য করে তুলুন

        android:clickable="true" 
        android:focusableInTouchMode="true" 
  2. একটি হাইডকি-বোর্ড () পদ্ধতি প্রয়োগ করুন

        public void hideKeyboard(View view) {
            InputMethodManager inputMethodManager =(InputMethodManager)getSystemService(Activity.INPUT_METHOD_SERVICE);
            inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(),InputMethodManager.HIDE_IMPLICIT_ONLY );
        }
  3. শেষ অবধি, আপনার সম্পাদনাটির ফোকাস চ্যাঞ্জলিস্টনার সেট করুন।

        edittext.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (!hasFocus) {
                    hideKeyboard(v);
                }
            }
        });

0

এটি কিছুটা জটিল। আমি এইভাবে করেছি এবং এটি কাজ করে।

1. উইন্ডো থেকে নরম ইনপুটটি আড়াল করার জন্য প্রথম কল করুন। এটি নরম ইনপুটটি আড়াল করে রাখবে যদি নরম কীবোর্ড দৃশ্যমান থাকে বা না থাকলে কিছুই না করে।

আপনার ডায়ালগটি দেখান

3.এখন নরম ইনপুট টগল করতে কল করুন।

কোড:

InputMethodManager inputManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
//hiding soft input
inputManager.hideSoftInputFromWindow(findViewById(android.R.id.content).getWind‌​owToken(), 0);
//show dialog
yourDialog.show();
//toggle soft input
inputManager.toggleSoftInput(InputMethodManager.SHOW_FORCED,InputMethodManager.SHOW_IMPLICIT);

0

এটা চেষ্টা কর

SomeUtils.java

public static void showKeyboard(Activity activity, boolean show) {
    InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);

    if(show)
        inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
    else
        inputMethodManager.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY,0);
}

0

অনেক চেষ্টা করেছিলেন কিন্তু এটিই আমার পক্ষে কাজ করেছে (কোটলিন):

        val dialog = builder.create()
        dialog.setOnShowListener {
            nameEditText.requestFocus()
            val s = ContextCompat.getSystemService(requireContext(), InputMethodManager::class.java)
            s?.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0)
        }

        dialog.setOnDismissListener {
            val s = ContextCompat.getSystemService(requireContext(), InputMethodManager::class.java)
            s?.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0)
        }

        dialog.show()

0

এ খুঁজছি https://stackoverflow.com/a/39144104/2914140 আমি একটু সরলীকৃত:

// In onCreateView():
view.edit_text.run {
    requestFocus()
    post { showKeyboard(this) }
}

fun showKeyboard(view: View) {
    val imm = view.context.getSystemService(
        Context.INPUT_METHOD_SERVICE) as InputMethodManager?
    imm?.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
}

এটি https://stackoverflow.com/a/11155404/2914140 এর চেয়ে ভাল :

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

কারণ আপনি যখন হোম বোতাম টিপুন এবং হোম স্ক্রিনে চলে যান, কীবোর্ডটি খোলা থাকবে।


-1
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

আমি যখন ক্রিয়াকলাপে আসি তখন স্বয়ংক্রিয়ভাবে কীবোর্ড দেখানোর জন্য আমি এটি অনক্রিট () এ কল করি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.