এডিট টেক্সট সহ অ্যালার্টডায়ালগ.বিল্ডার ব্যবহার করার সময়, সফ্ট কীবোর্ড পপ হয় না


117

ইনপুট পদ্ধতি হিসাবে এডিটেক্সট সহ একটি ইনপুট বাক্স তৈরি করতে আমি সতর্কতা ডায়ালগ.বিল্ডার ব্যবহার করছি ।

দুর্ভাগ্যক্রমে, সফ্ট কীবোর্ডটি পপ হয় না, যদিও এডিটেক্সট ফোকাসে রয়েছে, যদি আপনি স্পষ্টভাবে আবার এটি স্পর্শ না করেন।

এটিকে পপ করার জন্য কি কোনও উপায় আছে?

আমি (অ্যালার্টডায়ালগ.বিল্ডার) পরে শো করে (); তবে কোন লাভ হয়নি।

InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
mgr.showSoftInput(input, InputMethodManager.SHOW_FORCED);

কেউ সাহায্য করতে পারেন?

ধন্যবাদ !!


1
আপনার উত্স কোড বিন্যাস করুন।
ফিলিপ

তারপরে আমি আপনাকেও উজ্জীবিত করেছি :) একাধিক ঘন্টার জন্য আমার একই সমস্যা অনুসন্ধান হয়েছে এবং গ্রাইন 4ka এর শেষ উত্তরটি দুর্দান্ত কাজ করে
ফিলিপ্প

উত্তর:


222

আমি একটি জিনিস তৈরি করেছি

AlertDialog.Builder b = new AlertDialog.Builder(this);//....
AlertDialog dialog = b.create();

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

dialog.show();

3
তোমাকে অনেক ধন্যবাদ. আমি এখন কিছুক্ষণ সন্ধান করেছি এবং আপনি যে পথে যেতে চান এটি এটিই। সমস্ত OnFocusChangeListenerপদ্ধতির আমার কাছে অনেক কিছুই মনে হয় এবং সমস্যা সৃষ্টি করে। আপনি থেকে তৈরি করতে AlertDialogহবে AlertDialog.Builder!
ফিলিপ

এটি কি আসলেই একটি সমাধান? এটি কেবল কি-বোর্ডকে প্রদর্শন করতে বাধ্য করে, যদি কোনও ইনপুট ক্ষেত্র থাকে বা না থাকে তবে নির্বিশেষে যদি ইনপুট ক্ষেত্রটিতে ফোকাস থাকে বা না থাকে, তাই না? =)
টেড

@ আপনি সত্য বলেছিলেন যে এটি আসল সমাধান নয়, তবে এটি কাজ করে dialog
grine4ka

1
আমি আসলে "এটি সমাধান" (কার্যবিবরণী) পরিচালনা করি। আমি সম্পাদনা পাঠের জন্য সেটঅনফোকাস চ্যাঞ্জলিস্টনার ব্যবহার করি, এবং অনফোকাস চেঞ্জে যদি এটিতে "(হ্যাশফোকাস" ভার) ফোকাস রয়েছে কিনা তা যাচাই করুন এবং যদি তা হয় তবে আমি উইন্ডো () পেয়ে যাই set সেটসফট ইনপুটমোড (উইন্ডোম্যানেজ.লয়আউটপ্যারামস.ওসফT_INPUT_STATE_ALWAYS_VIS;
টেড

1
দ্রষ্টব্য: এটি কাজ করার জন্য আপনাকে setSoftInputModeলাইনটি আগে রেখে দেওয়া দরকার dialog.show() বা এটি কাজ করবে না। সাধারণ সঠিক সমাধান
বিটিডব্লিউয়ের

29

আমি এটির মতো সমাধান করতে পেরেছি:

Dialog = builder.create();
Dialog.show();
Dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE  | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
Dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

23

আমি জানতে পেরেছি যে একই কোডটি ট্যাবলেটটিতে সঠিকভাবে কাজ করে, কীবোর্ডটি পপ আপ করে, তবে ফোনে এটি হয় না, সুতরাং আরও গবেষণা করে দেখা যায় "সামঞ্জস্য করুন" বিকল্পের দিকে ইঙ্গিত করে।

আমি এটি ব্যবহার করছি, অনেক ক্লিনার মনে হচ্ছে।

AlertDialog d = builder.create();
d.getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
d.show();

ধন্যবাদ। এটি ব্যবহার করার চেয়ে ভাল SOFT_INPUT_STATE_ALWAYS_VISIBLE। যেমনটি SOFT_INPUT_STATE_ALWAYS_VISIBLEডায়ালগের ইউআই উপাদানগুলি অবরুদ্ধ করতে চলেছে, যেখানে ডায়ালগটিকে SOFT_INPUT_ADJUST_RESIZEপুনরায় আকার দিতে এবং "পুশ আপ" করতে সক্ষম।
চেওক ইয়ান চেং

10

আমার ক্ষেত্রে ডায়ালগটি প্রদর্শিত হওয়ার সময় আমি কেবল কীবোর্ডটি প্রদর্শন করতে সক্ষম হ'ল আমার DialogFragment:

@Override
public void onResume() {
    super.onResume();
    getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    myEditText.requestFocus();
}

উল্লেখ্য SOFT_INPUT_STATE_ALWAYS_VISIBLE পরিবর্তে SOFT_INPUT_STATE_VISIBLE

ডকুমেন্টেশন থেকে:

int SOFT_INPUT_STATE_ALWAYS_VISIBLE
Visibility state for softInputMode: please always make the soft input area visible when this window receives input focus.

এটি আমার জন্য কাজ করা একমাত্র সমাধান এবং আমি সেগুলির অনেকগুলি চেষ্টা করেছিলাম। খনি হ'ল অ্যালার্টডায়ালগ বিল্ডার থেকে একটি ডায়ালগফ্র্যাগমেন্ট বিল্ড। গুরুত্বপূর্ণ বিটটি উপরের কোডটি অনারিউম () এ স্থাপন করছে বলে মনে হচ্ছে। অন্য কোথাও এটি কাজ করে না!
ব্যবহারকারী 960914

6

যখন আপনি অনক্রিটডায়ালগ এ সতর্কতা ডায়ালগ ব্যবহার করে তৈরি একটি ডায়ালগ দেখানোর জন্য শোডায়ালগ কল করেন

আপনার কোডটি এখানে রাখা উচিত

    @Override
protected void onPrepareDialog (int id, Dialog dialog, Bundle args)
{
    TextView editText=(TextView) dialog.findViewById(R....);

    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

আরও অনেক ভাল সমাধান এখানে দেওয়া হল ।

dialog.getWindow().clearFlags(
         WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
        |WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);

কোন কর্মসংস্থান। EditTextপ্রত্যাশার মতো আচরণ করে


এটি আমার জন্য কাজ করেছিল, অন্য সমাধানটি ফোকাস আনছিল তবে কীবোর্ড প্রদর্শিত হয়নি।
অক্ষয়

2
Window window = dialog.getWindow();
    window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

1

এটি ইতিমধ্যে এখানে উত্তর ছিল । একটি অনফোকাস চেঞ্জলিস্টনার ব্যবহার আমার পক্ষে কাজ করেছিল।


একটি অ্যালার্টডায়লগ.বিল্ডার অবজেক্টের জন্য সফ্ট ইনপুট মোডটি কীভাবে সেট করবেন সেই প্রশ্নটি আপনাকে জিজ্ঞাসা করে। যদি আমি প্রস্তাবিত কোডটি ব্যবহার করার চেষ্টা করি (সতর্কতা.সেট উইন্ডো () ব্যবহার করে। আপনি কি আমাকে এটি ঠিক করতে সাহায্য করতে পারেন?
prepbgg

1

আমার ক্ষেত্রে, ডায়ালগটি দেখানোর আগে এটি তৈরি করার পরে (এটি তৈরির পরে) সফ্টইনপুটমোডটি প্রদর্শিত হচ্ছে না। নীচের কোডটি আমার জন্য কাজ করেছে যেখানে আমি ডায়ালগটি দেখানোর পরে সফ্টআইনপুটমড সেট করেছি।

Kotlin:

val dialog = MaterialAlertDialogBuilder(context) // Other builder code
                .create()
dialog.show()
dialog.window?.apply { // After the window is created, get the SoftInputMode
    clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE)
    clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM)
    setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE)
}

জাভা:

AlertDialog dialog = MaterialAlertDialogBuilder(getContext()) // Other builder code
                .create();
dialog.show();
Window window = dialog.getWindow();
if(window != null){ // After the window is created, get the SoftInputMode
    window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
    window.clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}

আমি আশা করি এটি যে কারওর মতোই আমার মতো একই সমস্যা ছিল তাকে সহায়তা করে।


0

এটি চেষ্টা করুন, এটি আমার জন্য কাজ করছে

আপনি যদি নরম কীবোর্ড প্রদর্শন করতে চান:

InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.showSoftInput(input.getWindowToken(), 0);

এবং আপনি যদি এটি গোপন করতে চান:

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

0
final AlertDialog.Builder alert = new AlertDialog.Builder(context);

final AlertDialog dialog = alert.show();
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

1
কোডের সাথে কিছু প্রসঙ্গ / ব্যাখ্যা অন্তর্ভুক্ত করা ভাল কারণ এটি উত্তর এবং ভবিষ্যতের পাঠকদের জন্য উত্তরকে আরও কার্যকর করে তোলে।
ইজোশুয়াস - মনিকা

0

AlertDialog.onCreate কল করার পরে editText যুক্ত করা হলে এই সমস্যা দেখা দেয় occurs

https://developer.android.com/reference/androidx/appcompat/app/AlertDialog.Builder

সতর্কতা ডায়ালগ ক্লাসটি স্বয়ংক্রিয়ভাবে android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM সেট করার যত্ন নেয় আপনার জন্য ডায়ালগের কোনও দৃশ্য ভিউ.অনেকচিটসেক্সটডিটার () থেকে সত্য হয় কিনা তার উপর ভিত্তি করে for

আপনাকে FLAG_ALT_FOCUSABLE_IM পতাকা সাফ করা দরকার।

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); 

অ্যালার্টডায়লগ.শো ডায়ালগফ্রেগমেন্ট.অনস্টার্টে কল হওয়ার কারণে, আপনি ডায়ালগফ্রেগমেন্ট.অনস্টার্টটিতে কোডটি সন্নিবেশ করতে পারেন।

@Override
public void onStart() {
    super.onStart();
    getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
}

অথবা আপনি যদি ডায়ালগফ্র্যাগমেন্টটি ব্যবহার না করেন তবে আপনি ডায়ালগ.সেটঅনশোলিস্টনার ব্যবহার করতে পারেন।

dialog.setOnShowListener(new DialogInterface.OnShowListener() {
    @Override
    public void onShow(DialogInterface dialog) {
        getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    }
});
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.