android - অ্যানড্রইড: ফোকাসটি যখন EditText এ থাকে তখন স্বয়ংক্রিয়ভাবে নরম কীবোর্ড দেখান




keyboard android-edittext (16)

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

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


অন্যান্য উত্তর থেকে কোডের স্নিপেটগুলি কাজ করে, তবে AlertDialog.Builder তাদের কোথায় রাখা উচিত তা সর্বদা স্পষ্ট নয়, বিশেষ করে যদি আপনি AlertDialog.Builder ব্যবহার AlertDialog.Builder এবং আনুষ্ঠানিক ডায়ালগ টিউটোরিয়াল অনুসরণ করেন কারণ এটি final AlertDialog ... ডায়ালগ ব্যবহার করে না 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);

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

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

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

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

কীবোর্ড দেখান

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

আপনি AlertDialogAlertDialog এ একটি ফোকাস শ্রোতা তৈরি করতে পারেন, তারপরে 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);
        }
    }
});

আমাকে ইউকুকে সমাধান করার জন্য কিছু অতিরিক্ত তথ্য নির্দেশ করা যাক, কারণ আমি এই কাজটি পেতে কষ্ট পেয়েছি! আমি কিভাবে AlertDialog বস্তুটি আমার AlertDialog.Builder থেকে পেতে পারি? আচ্ছা, এটা আমার 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);
      }
   }
});

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

// 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();

আমি চমৎকার Kotlin-esqe এক্সটেনশান ফাংশন তৈরি কেউ আগ্রহী আগ্রহী

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

এই বিট চতুর। আমি এই ভাবে করেনি এবং এটি কাজ করে।

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

2. আপনার ডায়ালগ প্রদর্শন করুন

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

এটা চেষ্টা কর

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

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

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

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

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

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

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

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

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

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

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

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

সমস্যাটি যেহেতু আপনার লেখাটি লিখার জায়গাটি প্রাথমিকভাবে (বা নেস্টেড বা কিছু) লুকানো থাকে, তখন অ্যালার্টডিয়ালগ স্বয়ংক্রিয়ভাবে পতাকাটিকে WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM সেটিংস সেট করে WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE 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);

হ্যাঁ আপনি 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);
        }
    }
});

horkavlna লিখেছেন,

টগ্ল

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

পদ্ধতি কাজ। কিন্তু দেখানোর ধরন আমার ক্ষেত্রে কাজ করে না। তাই hideKeyboard(editText); onCreate() আমি hideKeyboard(editText); তারপরে toggleKeyboard(editText); onStart() আমি toggleKeyboard(editText); এবং hideKeyboard(editText); onStop() আমি hideKeyboard(editText); লিখুন hideKeyboard(editText);

তিনটি সমস্যা আছে:

1) যখন একটি অ্যাপ্লিকেশন চালু বন্ধ পর্দা দিয়ে শুরু হয় তখন এটি কীবোর্ডকে লুকিয়ে রাখে,

2) প্রতিবার আপনি পর্দাটি চালু করলে এটি কীবোর্ড দেখাবে,

3) অ্যাপ্লিকেশন শেষ করার পরে আপনি অ্যান্ড্রয়েড প্রধান পর্দায় কীবোর্ড দেখতে পারেন।

বেশ কয়েকটি পরীক্ষার পর আমি এই পদ্ধতিগুলি সরানো এবং activity ট্যাগগুলিতে AndroidManifestandroid:windowSoftInputMode="stateVisible" লিখেছিলাম android:windowSoftInputMode="stateVisible" বা android:windowSoftInputMode="stateAlwaysHidden"


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

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





soft-keyboard