android - Edittext ফোকাস যখন নরম কীবোর্ড প্রদর্শন কিভাবে




keyboard focus (20)

যখন আমি EditText টি দৃষ্টি নিবদ্ধ করি তখন আমি স্বয়ংক্রিয়ভাবে নরম-কীবোর্ডটি দেখাতে চাই (যদি ডিভাইসটি কোনও শারীরিক কীবোর্ড না থাকে) এবং আমার দুটি সমস্যা রয়েছে:

  1. যখন আমার Activity প্রদর্শিত হয়, তখন আমার EditText দৃষ্টি নিবদ্ধ করা হয় তবে কীবোর্ডটি প্রদর্শিত হয় না, আমাকে কীবোর্ডটি দেখানোর জন্য এটি আবার ক্লিক করতে হবে (আমার Activity প্রদর্শিত হলে এটি প্রদর্শিত হবে)।

  2. এবং যখন আমি কীবোর্ডে সম্পন্ন ক্লিক করি, তখন কীবোর্ডটি সরাতে হয় তবে EditText ফোকাস থাকে এবং y চান না (কারণ আমার সম্পাদনা সম্পন্ন হয়)।

পুনরায় শুরু করার জন্য, আমার সমস্যাটি EditText আরও কিছু পছন্দ করার মতো: যা আমার সম্পাদনা EditText সাথে কীবোর্ড সিঙ্ক রাখে (ফোকাস / ফোকাস না) এবং অবশ্যই কোনও শারীরিক থাকলে একটি সফ্ট-কীবোর্ড উপস্থিত হয় না।


Xamarin ব্যবহার করে, এটি একটি খণ্ড ভিতরে আমার জন্য কাজ করে:

using Android.Views.InputMethods;
using Android.Content;

...

if ( _txtSearch.RequestFocus() ) {
  var inputManager = (InputMethodManager) Activity.GetSystemService( Context.InputMethodService );
  inputManager.ShowSoftInput( _txtSearch, ShowFlags.Implicit );
}

আপনার onResume () বিভাগে আপনি যা করতে পারেন সেটি কল করতে পারেন কেবোর্ড ();

 onResume() {
     EditText yourEditText= (EditText) findViewById(R.id.yourEditText);
     bringKeyboard(yourEditText);
 }


  protected boolean bringKeyboard(EditText view) {
    if (view == null) {
        return false;
    }
    try {
      // Depending if edittext has some pre-filled values you can decide whether to bring up soft keyboard or not
        String value = view.getText().toString();
        if (value == null) {
            InputMethodManager imm = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
            return true;
        }
    } catch (Exception e) {
        Log.e(TAG, "decideFocus. Exception", e);
    }
    return false;
  }

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

...
dialog.show();
input.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

আমার বিভিন্ন পরিস্থিতিতে একই সমস্যা ছিল, এবং সমাধানগুলি আমি কিছু খুঁজে পেয়েছি কিন্তু অন্যদের মধ্যে কাজ করি না তাই এখানে পাওয়া এক সংহত সমাধান যা বেশিরভাগ পরিস্থিতিতে পাওয়া যায়:

public static void showVirtualKeyboard(Context context, final View view) {
    if (context != null) {
        final InputMethodManager imm =  (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        view.clearFocus();

        if(view.isShown()) {
            imm.showSoftInput(view, 0);
            view.requestFocus();
        } else {
            view.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
                @Override
                public void onViewAttachedToWindow(View v) {
                    view.post(new Runnable() {
                        @Override
                        public void run() {
                            view.requestFocus();
                            imm.showSoftInput(view, 0);
                        }
                    });

                    view.removeOnAttachStateChangeListener(this);
                }

                @Override
                public void onViewDetachedFromWindow(View v) {
                    view.removeOnAttachStateChangeListener(this);
                }
            });
        }
    }
}

আমি এই সাহায্য ক্লাস তৈরি। শুধু প্রসঙ্গ এবং দৃশ্যটি আপনি ফোকাস করতে চান এবং কীবোর্ডটি দেখান এবং কীবোর্ড লুকাতে চান। আমি আসা করি এটা সাহায্য করবে.

public class FocusKeyboardHelper {

private View view;
private Context context;
private InputMethodManager imm;

public FocusKeyboardHelper(Context context, View view){
    this.view = view;
    this.context = context;
    imm = (InputMethodManager) context.getSystemService(context.INPUT_METHOD_SERVICE);
}

public void focusAndShowKeyboard(){

    view.requestFocus();
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);

}

public void hideKeyBoard(){
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

}


আমি একই সমস্যা ছিল। জিডি থেকে ভিস্তিবলে পরিবর্তনযোগ্য পরিবর্তন সম্পাদন করার পরে, আমাকে ফোকাস সেট করতে এবং নরম কীবোর্ড প্রদর্শন করতে হয়েছিল। আমি নিম্নলিখিত কোডটি ব্যবহার করে এটি অর্জন করেছি:

new Handler().postDelayed(new Runnable() {

    public void run() {
//        ((EditText) findViewById(R.id.et_find)).requestFocus();
//              
        EditText yourEditText= (EditText) findViewById(R.id.et_find);
//        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
//        imm.showSoftInput(yourEditText, InputMethodManager.SHOW_IMPLICIT);

        yourEditText.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
        yourEditText.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));                           
    }
}, 200);

এটি 100 মিটার বিলম্বের সাথে আমার জন্য কাজ করে, তবে কোনও বিলম্ব ছাড়াই বা শুধুমাত্র 1 মিমি বিলম্বের সাথে ব্যর্থ হয়।

কোডের অংশটি অন্য দৃষ্টিভঙ্গি দেখায় যা কেবল কিছু ডিভাইসে কাজ করে। আমি ওএস সংস্করণ 2.2 (এমুলেটর), 2.2.1 (রিয়েল ডিভাইস) এবং 1.6 (এমুলেটর) পরীক্ষা করেছি।

এই পদ্ধতির ব্যথা আমাকে অনেক সংরক্ষিত।


আমি এখানে সব মিলিত এবং আমার জন্য এটি কাজ করে:

public static void showKeyboardWithFocus(View v, Activity a) {
    try {
        v.requestFocus();
        InputMethodManager imm = (InputMethodManager) a.getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(v, InputMethodManager.SHOW_IMPLICIT);
        a.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

আমি নীচের কোড সঙ্গে কিছু সহজ ক্ষেত্রে কিছু সাম্প্রতিক ভাগ্য আছে। আমি সব পরীক্ষা শেষ না কিন্তু ....

EditText input = (EditText) findViewById(R.id.Input);
input.requestFocus();    
input.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
input.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));

এবং presto কীবোর্ড দেখায়।


উপরের সমস্ত সমাধান ( OnFocusManager ইন্টারঅ্যাকশন OnFocusChangeListener.onFocusChange আপনার EditText এ সংযুক্ত শ্রোতা ভাল কাজ করে যদি আপনার কার্যকলাপে একক সম্পাদনা থাকে।

আমার ক্ষেত্রে আমার দুটি সম্পাদনা আছে।

 private EditText tvX, tvY;
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
 tvX.setOnFocusChangeListener(this);
    tvY.setOnFocusChangeListener(this);

@Override
public void onFocusChange(View v, boolean hasFocus) {       
    InputMethodManager imm =  (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if(tvX.hasFocus() || tvY.hasFocus()) {            
        imm.showSoftInput(v, 0);            
    } else {
        imm.hideSoftInputFromWindow(v.getWindowToken(), 0);         
    }       
};

আমি লক্ষ্য করেছি যে ফোকাস চেঞ্জটি TVX এর জন্য হ্যাশফোকাস = সত্য (কীবোর্ড দেখানো হয়েছে) এর সাথে ট্রিগার হয়েছে তবে তারপরে হ্যাশফোকাস = সত্য (কীবোর্ড লুকানো) সহ TVY এর জন্য। শেষে, কোন কীবোর্ড দৃশ্যমান ছিল।

সাধারণ সমাধানটি সঠিক বিবৃতিতে থাকা উচিত যদি "সম্পাদনা কী টেক্সট সম্পাদনা করে থাকে যদি কীবোর্ডটি দেখায়"


এটা আমার জন্য কাজ করে। আপনি কীবোর্ডটি দেখানোর জন্য এটি দিয়েও চেষ্টা করতে পারেন:

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

কীবোর্ড প্রদর্শিত হতে, ব্যবহার করুন

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

InputMethodManager সরাসরি চালানোর চেয়ে এই পদ্ধতিটি আরো নির্ভরযোগ্য।

এটি বন্ধ, ব্যবহার করুন

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

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

getActivity().getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

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

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

নরম কীবোর্ড প্রদর্শিত করার জন্য, আপনি ব্যবহার করতে পারেন

EditText yourEditText= (EditText) findViewById(R.id.yourEditText);
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(yourEditText, InputMethodManager.SHOW_IMPLICIT);

এবং EditText এ ফোকাসটি সরানোর জন্য দুঃখিতভাবে ফোকাস দখল করার জন্য আপনাকে একটি ডামি View থাকতে হবে।

আশা করি এটা কাজে লাগবে

এটি বন্ধ করতে আপনি ব্যবহার করতে পারেন

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

এটি একটি কথোপকথনে এটি ব্যবহার করার জন্য কাজ করে

public void showKeyboard(){
    InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
}

public void closeKeyboard(){
    InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
}

নরম কীবোর্ডের সাথে আমার সমস্যাটি বিশ্বাস করা হয়েছে কিনা তা আমি সমাধান করেছি যখন আমি আবিষ্কার করেছি যে ক্রিয়াকলাপগুলি অ্যানিমেশনগুলি নরম কীবোর্ড নিষ্ক্রিয় করতে পারে। যখন আপনি উদ্দেশ্য সঙ্গে কল

i.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);

এবং

overridePendingTransition(0, 0);

এটি নরম কীবোর্ডটি লুকাতে পারে এবং এটি দেখানোর কোন উপায় নেই।


ফাটল জন্য, নিশ্চিত তার কাজ:

 displayName = (EditText) view.findViewById(R.id.displayName);
    InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

যখন অন্য কিছুই কাজ করে না, এটি দেখানোর জন্য জোর করুন :

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

শুধু অ্যান্ড্রয়েড যোগ করুন: ম্যানিফেস্ট ফাইলে উইন্ডোSoftInputMode = "stateHidden" ...


android:windowSoftInputMode="stateAlwaysVisible" -> ম্যানিফেস্ট ফাইলে।

edittext.requestFocus(); -> কোড।

এটি নরম কীবোর্ড খুলবে যা সম্পাদনা-পাঠ্য কার্যকলাপের দৃষ্টিভঙ্গি হিসাবে ফোকাস অনুরোধ করেছে।


final InputMethodManager keyboard = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
keyboard.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);

 void requestFocus(View editText, Activity activity)
{
    try {
        editText.requestFocus();
        InputMethodManager imm = (InputMethodManager) a.getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
        activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
    } catch (Exception e) {
        e.printStackTrace();
    }

}

এই লাইন যোগ করুন খুব ভুলবেন না

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




android-softkeyboard