ব্যবহারকারী নরম কীবোর্ডকে বাতিল করে দিচ্ছেন তা সনাক্ত করা হচ্ছে


114

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

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

আমার সমস্যাটি হল যখন ব্যবহারকারী ব্যাক কী টিপে কীবোর্ডটি খারিজ করে দেয়। ওএস কীবোর্ডটি খারিজ করে তবে আমার নির্দেশাবলী (যা আমার লুকানোর দরকার আছে) তা এখনও দৃশ্যমান।

আমি ওনকিডাউনকে ওভাররাইড করার চেষ্টা করেছি, তবে কীবোর্ডটি খারিজ করার জন্য যখন ব্যাক বোতামটি ব্যবহৃত হয় তখন কল হবে বলে মনে হয় না।

আমি সম্পাদনা পাঠ্য উইজেটটিতে একটি অনকিজিলেস্টারার সেট করার চেষ্টা করেছি, তবে এটিরও কল করা হবে বলে মনে হয় না।

সফট কীবোর্ড যখন বরখাস্ত করা হচ্ছে তখন আমি কীভাবে সনাক্ত করতে পারি?

উত্তর:


160

আমি এটি করার একটি উপায় জানি। সাবট্রাক্ট এডিটেক্সট এবং প্রয়োগ করুন:

@Override
public boolean onKeyPreIme(int keyCode, KeyEvent event) {
  if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
    // Do your thing.
    return true;  // So it is not propagated.
  }
  return super.dispatchKeyEvent(event);
}

এখানে কিভাবে আপনার কাস্টম মতামত ব্যবহার করার জন্য একটি লিঙ্ক (যখন আপনি উপশ্রেণী editText জন্য) হল: http://developer.android.com/guide/topics/ui/custom-components.html


2
আমি হার্ডওয়্যার কীবোর্ড সহ অ্যান্ড্রয়েড ব্যবহারকারীদের কাছ থেকে এমন প্রতিবেদন পাচ্ছি যে এটি করা কোনওভাবে কী টিপুনগুলিতে হস্তক্ষেপ করে। আমার কাছে এই মুহুর্তে কোনও অতিরিক্ত তথ্য নেই।
esilver

আমি বেশ কয়েকটি সমাধান খুঁজছি, এটি এখন পর্যন্ত সেরা!
ফ্রিজগার্ড

10
অপেক্ষা করুন অপেক্ষা করুন, আমি কেবল এটি তৃতীয়বারের দিকে চেয়েছিলাম - সুপার কলটি হওয়া উচিত নয় onKeyPreIme? নাকি তা না হওয়ার কোনও বিশেষ কারণ আছে?
এরহানিস

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

2
অনুরূপ প্রভাব অর্জন @tbm SearchView, দয়া করে পড়ুন stackoverflow.com/questions/9629313/...
Cheok ইয়ান চেঙ

124

জে, আপনার সমাধান ভাল! ধন্যবাদ :)

public class EditTextBackEvent extends EditText {

    private EditTextImeBackListener mOnImeBack;

    public EditTextBackEvent(Context context) {
        super(context);
    }

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

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

    @Override
    public boolean onKeyPreIme(int keyCode, KeyEvent event) {
        if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && 
            event.getAction() == KeyEvent.ACTION_UP) {
            if (mOnImeBack != null) 
                mOnImeBack.onImeBack(this, this.getText().toString());
        }
        return super.dispatchKeyEvent(event);
    }

    public void setOnEditTextImeBackListener(EditTextImeBackListener listener) {
        mOnImeBack = listener;
    }

}

public interface EditTextImeBackListener {
    public abstract void onImeBack(EditTextBackEvent ctrl, String text);
}

কোন বিশেষ কারণ যা আমরা KeyEvent.ACTION_UPপাশাপাশি সনাক্ত করতে চাই ?
চেওক ইয়ান চেং

2
@ চেওক্যান চেং কারণ এটি ব্যবহারকারীর ক্রিয়াকলাপটি সাধারণত বোতাম ছাড়ার সময় কার্যকর করা উচিত, এবং এটি টিপতে শুরু করার সময় নয়।
জায়েফকেয়ে

3
android.support.v7.widget.AppCompatEditTextটিন্টিংয়ের জন্য প্রসারিত করার বিষয়টি নিশ্চিত করুন ।
সানভিওয়েল

প্রসারিত করুন: AppCompatEditTextঅ্যান্ড্রয়েডক্সের জন্য
COYG

গ্রেট! আমি কেবল আপনার সমাধানটি উদার করতে কেবল একটি উন্নতির পরামর্শ দেব। আমি onKeyPreIme থেকে "যেমনটি" শ্রোতাদের কাছে যুক্তিগুলি পাঠিয়ে দেব, আপনি আপনার যুক্তিটি বিভিন্নভাবে যেখানে আপনার প্রয়োজন সেখানে প্রয়োগ করতে পারেন।
marcRDZ

17

আমি সুপার.অনেকিপ্রাইম () কে কল করে জয়ের সমাধানে কিছুটা পরিবর্তন করেছি:

_e = new EditText(inflater.getContext()) {
@Override
public boolean onKeyPreIme(int keyCode, KeyEvent event) {
    if (event.getKeyCode() == KeyEvent.KEYCODE_BACK){
            cancelTextInput();
        }
        return super.onKeyPreIme(keyCode, event);
    }
};

অপূর্ব সমাধান, জে, +1!


14

কীবোর্ড প্রদর্শিত হচ্ছে কিনা তা সনাক্ত করতে এখানে আমার কাস্টম সম্পাদনা পাঠ্যক্রম রয়েছে

/**
 * Created by TheFinestArtist on 9/24/15.
 */
public class KeyboardEditText extends EditText {

    public KeyboardEditText(Context context) {
        super(context);
    }

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

    public KeyboardEditText(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
        super.onFocusChanged(focused, direction, previouslyFocusedRect);
        if (listener != null)
            listener.onStateChanged(this, true);
    }

    @Override
    public boolean onKeyPreIme(int keyCode, @NonNull KeyEvent event) {
        if (event.getKeyCode() == KeyEvent.KEYCODE_BACK
                && event.getAction() == KeyEvent.ACTION_UP) {
            if (listener != null)
                listener.onStateChanged(this, false);
        }
        return super.onKeyPreIme(keyCode, event);
    }

    /**
     * Keyboard Listener
     */
    KeyboardListener listener;

    public void setOnKeyboardListener(KeyboardListener listener) {
        this.listener = listener;
    }

    public interface KeyboardListener {
        void onStateChanged(KeyboardEditText keyboardEditText, boolean showing);
    }
}

8

এটি এখন 2019 ...
সুতরাং আমি কোটলিনের সাথে আরও ঝরঝরে সমাধান তৈরি করেছি

1. একটি এক্সটেনশন ফাংশন তৈরি করুন:

fun Activity.addKeyboardToggleListener(onKeyboardToggleAction: (shown: Boolean) -> Unit): KeyboardToggleListener? {
    val root = findViewById<View>(android.R.id.content)
    val listener = KeyboardToggleListener(root, onKeyboardToggleAction)
    return root?.viewTreeObserver?.run {
        addOnGlobalLayoutListener(listener)
        listener
    }
}

2. টগল শ্রোতা যেখানে আছেন:

open class KeyboardToggleListener(
        private val root: View?,
        private val onKeyboardToggleAction: (shown: Boolean) -> Unit
) : ViewTreeObserver.OnGlobalLayoutListener {
    private var shown = false
    override fun onGlobalLayout() {
        root?.run {
            val heightDiff = rootView.height - height
            val keyboardShown = heightDiff > dpToPx(200f)
            if (shown != keyboardShown) {
                onKeyboardToggleAction.invoke(keyboardShown)
                shown = keyboardShown
            }
        }
    }
}

fun View.dpToPx(dp: Float) = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, resources.displayMetrics).roundToInt()

৩. যেকোন ক্রিয়াকলাপে এটি এর মতো সহজ ব্যবহার করুন :

addKeyboardToggleListener {shown ->
          // hurray! Now you know when the keyboard is shown and hidden!!
      }

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

@ র্যান্ডম এঙ্গি এটি কীবোর্ড টগললিস্টনার-এ স্থির করেছে। লক্ষ্য করার জন্য ধন্যবাদ
লিও ড্রয়েডকোডার

4

এডিটেক্সট প্রসারিত করে এমন একটি শ্রেণী তৈরি করুন এবং আপনার কোডটিতে সেই সম্পাদনাটি ব্যবহার করুন, আপনার কেবলমাত্র কাস্টম সম্পাদনা পাঠের ক্ষেত্রে নিম্নলিখিত পদ্ধতিটি ওভাররাইড করা উচিত:

@Override
 public boolean onKeyPreIme(int keyCode, KeyEvent event) {
 if (keyCode == KeyEvent.KEYCODE_BACK) {

    //Here it catch all back keys
    //Now you can do what you want.

} else if (keyCode == KeyEvent.KEYCODE_MENU) {
    // Eat the event
    return true;
}
return false;}

কীবোর্ড খোলার সময় সনাক্ত করার কোনও উপায় আছে?
পাউডার366

3

মূল শ্রোতার সাথে একটি সমাধান এখানে। কেন এটি কাজ করে সে সম্পর্কে আমার কোনও ধারণা নেই তবে আপনি যদি আপনার কাস্টম সম্পাদনা পাঠ্যে খালি খালি onKeyPreIme কে ওভাররাইড করেন তবে অনকাইলিস্টনার কাজ করে।

SomeClass.java

customEditText.setOnKeyListener((v, keyCode, event) -> {
            if(event.getAction() == KeyEvent.ACTION_DOWN) {
                switch (keyCode) {
                    case KeyEvent.KEYCODE_BACK:
                        getPresenter().onBackPressed();
                        break;
                }
            }
            return false;
        }); 

CustomEditText.java

@Override
    public boolean onKeyPreIme(int keyCode, KeyEvent event) {
        return super.dispatchKeyEvent(event);
    }

3

@ অলিভিয়ের_এসডিগির উত্তর ব্যবহার করে, কিন্তু কোটলিনে রূপান্তরিত:

class KeyboardEditText : AppCompatEditText {

    var listener: Listener? = null
  
    constructor(context: Context) : super(context)
    constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
  
    override fun onKeyPreIme(keyCode: Int, event: KeyEvent): Boolean {
        if (event.keyCode == KeyEvent.KEYCODE_BACK && event.action == KeyEvent.ACTION_UP) {
            listener?.onImeBack(this)
        }
        return super.dispatchKeyEvent(event)
    }
  
    interface Listener {
        fun onImeBack(editText: KeyboardEditText)
    }

}

ব্যবহার:

keyboardEditText.listener = object : KeyboardEditText.Listener {
    override fun onImeBack(editText: KeyboardEditText) {
        //Back detected
    }
}

2

যামারিনে যে কেউ একই কাজ করতে দেখছে তাদের পক্ষে আমি কয়েকটি শীর্ষের উত্তরটি কিছুটা আলাদা বলে অনুবাদ করেছি। আমি এখানে একটি গিস্ট তৈরি করেছি তবে সংক্ষেপে, আপনি একটি কাস্টম এডিটেক্সট তৈরি করেন এবং এর OnKeyPreImeমতো ওভাররাইড করুন :

public class CustomEditText : EditText
{
    public event EventHandler BackPressed;

    // ...

    public override bool OnKeyPreIme([GeneratedEnum] Keycode keyCode, KeyEvent e)
    {
        if (e.KeyCode == Keycode.Back && e.Action == KeyEventActions.Up)
        {
            BackPressed?.Invoke(this, new EventArgs());
        }

        return base.OnKeyPreIme(keyCode, e);
    }
}

... এবং তারপরে ...

editText = FindViewById<CustomEditText>(Resource.Id.MyEditText);
editText.BackPressed += (s, e) => 
{
    // <insert code here>
};

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

0

hideSoftInputFromWindow কীবোর্ড বন্ধ হলে অ্যান্ড্রয়েডে কীবোর্ডটি সনাক্ত করতে এর মানটি ব্যবহার করা বন্ধ হয়ে যায় returns

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

        if (imm.hideSoftInputFromWindow(findFocus().getWindowToken(),
                InputMethodManager.HIDE_NOT_ALWAYS)) {
            //keyboard is closed now do what you need here
        }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.