আমি কীভাবে ImeOptions এর সম্পন্ন বোতাম ক্লিক পরিচালনা করব?


185

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

editText.setImeOptions(EditorInfo.IME_ACTION_DONE);

যখন ব্যবহারকারী স্ক্রিন কীবোর্ডে সম্পন্ন বোতামটি ক্লিক করেন (টাইপিং সমাপ্ত) আমি একটি RadioButtonরাষ্ট্র পরিবর্তন করতে চাই ।

স্ক্রিন কীবোর্ড থেকে হিট হয়ে গেলে আমি কীভাবে সম্পন্ন বোতামটি ট্র্যাক করতে পারি?

স্ক্রিনশটটি সফ্টওয়্যার কীবোর্ডের নীচে ডানদিকের 'সম্পন্ন' বোতামটি দেখায়


1
OnKeyboardActionListener হতে পারে আমাকে কোনও কোড উদাহরণ সাহায্য করবে ??
ডি-ম্যান

উত্তর:


210

আমি রবার্টস এবং চিরাগস উত্তরগুলির সংমিশ্রণে শেষ করেছি:

((EditText)findViewById(R.id.search_field)).setOnEditorActionListener(
        new EditText.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        // Identifier of the action. This will be either the identifier you supplied,
        // or EditorInfo.IME_NULL if being called due to the enter key being pressed.
        if (actionId == EditorInfo.IME_ACTION_SEARCH
                || actionId == EditorInfo.IME_ACTION_DONE
                || event.getAction() == KeyEvent.ACTION_DOWN
                && event.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
            onSearchAction(v);
            return true;
        }
        // Return true if you have consumed the action, else false.
        return false;
    }
});

আপডেট: উপরের কোডটি কিছু সময় কলব্যাক দুটিবার সক্রিয় করবে। পরিবর্তে আমি নিম্নলিখিত কোডটি বেছে নিয়েছি, যা আমি গুগল চ্যাট ক্লায়েন্টদের কাছ থেকে পেয়েছি:

public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
    // If triggered by an enter key, this is the event; otherwise, this is null.
    if (event != null) {
        // if shift key is down, then we want to insert the '\n' char in the TextView;
        // otherwise, the default action is to send the message.
        if (!event.isShiftPressed()) {
            if (isPreparedForSending()) {
                confirmSendMessageIfNeeded();
            }
            return true;
        }
        return false;
    }

    if (isPreparedForSending()) {
        confirmSendMessageIfNeeded();
    }
    return true;
}

4
আমি কেবল IME_ACTION_DONE সন্ধান করেছি এবং আমি অবাক হয়েছি যে এটি ট্রিগার হয়নি। আমিও ACTION_DOWN এবং KEYCODE_ENTER অনুসন্ধান করার পরে এটি শেষ পর্যন্ত এডিটরএ্যাকশন () এ ট্রিগার করে। যেহেতু আমি অন্তর্নির্মিত কীবোর্ডের মধ্যে কোনও পার্থক্য দেখছি না (আমি এন্টার কীটি হাইলাইট হওয়ার প্রত্যাশা করেছি) আমি আশ্চর্য করি যে এন্ড্রয়েড ব্যবহারের মূল বিষয়টি কী: এডিটেক্সট এক্সএমএল লেআউটের জন্য imeOptions = "actionSend"।
কেউ কোথাও

কেন এই উত্তর গৃহীত হয় না। এটি কি কয়েকটি ক্ষেত্রে ব্যর্থ হয় ??
আর্কি.বিপিজিসি


2
দ্বিতীয় সমাধানটিও দুবার ট্রিগার করা হয়।
বাগসফ্লায়ার

1
কী isPreparedForSending()এবং দ্বিতীয় পদ্ধতিটি কেন ফিরে আসে true?
কুলমাইন্ড

122

এটি ব্যবহার করে দেখুন, আপনার যা প্রয়োজন তা এটির জন্য কাজ করা উচিত:


editText.setOnEditorActionListener(new EditText.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
    if (actionId == EditorInfo.IME_ACTION_DONE) {
       //do here your stuff f
       return true;
    }
    return false;
    } 
});

10
এটি এইচটিসি ইভোর পক্ষে কাজ করে না। যতদূর আমি বুঝতে সক্ষম হয়েছি, এইচটিসি তাদের নিজস্ব সফট কীবোর্ড প্রয়োগ করেছে যা imeOptions উপেক্ষা করে।
ড্যান

এটি যথেষ্ট (গ্রহণযোগ্য উত্তরের মতো ইভেন্ট ক্রিয়া বা কী কোডটি দেখার দরকার নেই); আমার নেক্সাস এবং স্যামসাং পরীক্ষার ডিভাইসে কাজ করে।
জোনিক

কেবল নিরাপদ থাকতে, <EditText android:imeOptions="actionDone" android:inputType="text"/>
কোডটিতে

40
<EditText android:imeOptions="actionDone"
          android:inputType="text"/>

জাভা কোডটি হ'ল:

edittext.setOnEditorActionListener(new OnEditorActionListener() { 
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_DONE) {
            Log.i(TAG,"Here you can write the code");
            return true;
        }    
        return false;
    }
});

আপনি যদি সামঞ্জস্য রেখে বলেছেন যে আপনি এটিকে পরিচালনা করেছেন
টিম কিস্ট

26

আমি জানি এই প্রশ্নটি পুরানো, তবে আমার জন্য কী কাজ করেছে তা আমি উল্লেখ করতে চাই।

আমি অ্যান্ড্রয়েড বিকাশকারী ওয়েবসাইট (নীচে প্রদর্শিত) থেকে নমুনা কোডটি ব্যবহার করার চেষ্টা করেছি , তবে এটি কার্যকর হয়নি। সুতরাং আমি সম্পাদকীয় ইনফো ক্লাসটি পরীক্ষা করেছিলাম এবং আমি বুঝতে পেরেছিলাম যে IME_ACTION_SEND পূর্ণসংখ্যা মান হিসাবে নির্দিষ্ট করা হয়েছে 0x00000004

অ্যান্ড্রয়েড বিকাশকারীদের কাছ থেকে নমুনা কোড:

editTextEmail = (EditText) findViewById(R.id.editTextEmail);
editTextEmail
        .setOnEditorActionListener(new OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId,
                    KeyEvent event) {
                boolean handled = false;
                if (actionId == EditorInfo.IME_ACTION_SEND) {
                    /* handle action here */
                    handled = true;
                }
                return handled;
            }
        });

সুতরাং, আমি আমার res/values/integers.xmlফাইলটিতে পূর্ণসংখ্যা মান যুক্ত করেছি ।

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="send">0x00000004</integer>
</resources>

তারপর, আমি আমার বিন্যাস ফাইল সম্পাদিত res/layouts/activity_home.xmlনিম্নরূপ

<EditText android:id="@+id/editTextEmail"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:imeActionId="@integer/send"
  android:imeActionLabel="@+string/send_label"
  android:imeOptions="actionSend"
  android:inputType="textEmailAddress"/>

এবং তারপরে, নমুনা কোডটি কাজ করেছিল।


17

কীভাবে অনকেইলিস্টনার সেট করবেন সে সম্পর্কে আরও বিশদ এবং এটি সম্পন্ন বোতামটি শুনতে হবে।

প্রথমে আপনার ক্লাসের প্রয়োগ বিভাগে অনকাইলিস্টনার যুক্ত করুন। তারপরে OnKeyListener ইন্টারফেসে সংজ্ঞায়িত ফাংশনটি যুক্ত করুন:

/*
 * Respond to soft keyboard events, look for the DONE press on the password field.
 */
public boolean onKey(View v, int keyCode, KeyEvent event)
{
    if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
        (keyCode == KeyEvent.KEYCODE_ENTER))
    {
        // Done pressed!  Do something here.
    }
    // Returning false allows other listeners to react to the press.
    return false;
}

একটি সম্পাদনা পাঠ্য বস্তু দেওয়া হয়েছে:

EditText textField = (EditText)findViewById(R.id.MyEditText);
textField.setOnKeyListener(this);

2
এটি অ্যাপ্লিকেশনগুলিতে এপিআই স্তরের 17+ লক্ষ্যবস্তুতে আর কাজ করে না, কারণ আপনার অনকাইলিস্টনার আর সফট-কী ইভেন্টগুলির জন্য বরখাস্ত করা হয় না: developer.android.com/references/android/text/method/…
jjb

তারা কি এখন বিকল্প প্রস্তাব দেয়?
রবার্ট হকী

2
আমি EditorInfo.IME_ACTION_DONE সন্ধানের জন্য setOnEditorActionListener ব্যবহার করতে স্যুইচ করেছি, যা ভালভাবে কাজ করছে বলে মনে হচ্ছে।
জেজেবি

অনকির সত্য হওয়া উচিত, মিথ্যা নয়।
ralphgabb

16

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

<EditText
  android:id="@+id/password"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:hint="@string/prompt_password"
  android:imeActionId="@+id/login"
  android:imeActionLabel="@string/action_sign_in_short"
  android:imeOptions="actionUnspecified"
  android:inputType="textPassword"
  android:maxLines="1"
  android:singleLine="true"/>

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

এটি অবশ্য এটিই ছিল এমন বৈশিষ্ট্য imeOptions="actionUnspecified"যা আমি এর উদ্দেশ্য বুঝতে পারি নি। অ্যান্ড্রয়েড আপনাকে কীবোর্ডের সাথে ইন্টারঅ্যাক্ট করতে দেয় যা স্ক্রিনের নীচে থেকে পপ আপ হয় যখন ব্যবহার করে পাঠ্যটি নির্বাচন করা হয় InputMethodManager। কীবোর্ডের নীচের কোণায়, একটি বোতাম রয়েছে, এটি বর্তমান পাঠ্য ক্ষেত্রের উপর নির্ভর করে সাধারণত "পরবর্তী" বা "সম্পন্ন" বলে। অ্যান্ড্রয়েড আপনাকে এটি ব্যবহার করে কাস্টমাইজ করতে দেয় android:imeOptions। আপনি একটি "প্রেরণ" বাটন বা "পরবর্তী" বোতামটি নির্দিষ্ট করতে পারেন। সম্পূর্ণ তালিকা এখানে পাওয়া যাবে

এটির TextView.OnEditorActionListenerসাহায্যে আপনি EditTextউপাদানটির জন্য একটি নির্ধারণ করে ক্রিয়া বোতামে টিপুন শুনতে পারেন listen যেমন আপনার উদাহরণ হিসাবে:

editText.setOnEditorActionListener(new EditText.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(EditText v, int actionId, KeyEvent event) {
    if (actionId == EditorInfo.IME_ACTION_DONE) {
       //do here your stuff f
       return true;
    }
    return false;
    } 
});

এখন আমার উদাহরণে আমার android:imeOptions="actionUnspecified"বৈশিষ্ট্য ছিল । আপনি যখন কোনও ব্যবহারকারীর প্রবেশ কী টিপুন তখন লগইন করার চেষ্টা করতে চাইলে এটি কার্যকর হয়। আপনার ক্রিয়াকলাপে, আপনি এই ট্যাগটি সনাক্ত করতে পারেন এবং তারপরে লগইনটি চেষ্টা করতে পারেন:

    mPasswordView = (EditText) findViewById(R.id.password);
    mPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) {
            if (id == R.id.login || id == EditorInfo.IME_NULL) {
                attemptLogin();
                return true;
            }
            return false;
        }
    });

6

কোটলিনের চিক্কা.আনদেব এবং অ্যালেক্স কোহনকে ধন্যবাদ এটি হ'ল:

text.setOnEditorActionListener { v, actionId, event ->
    if (actionId == EditorInfo.IME_ACTION_DONE ||
        event?.action == KeyEvent.ACTION_DOWN && event.keyCode == KeyEvent.KEYCODE_ENTER) {
        doSomething()
        true
    } else {
        false
    }
}

এখানে আমি Enterকী পরীক্ষা করে দেখি কারণ এটি EditorInfo.IME_NULLপরিবর্তে ফিরে আসে IME_ACTION_DONE

আরও দেখুন অ্যানড্রইড imeOptions = "actionDone" কাজ করছে না । যোগ android:singleLine="true"করুন EditText


6

কোটলিন সলিউশন

কোটলিনে এটি হ্যান্ডেল করার বেস উপায়:

edittext.setOnEditorActionListener { _, actionId, _ ->
    if (actionId == EditorInfo.IME_ACTION_DONE) {
        callback.invoke()
        true
    }
    false
}

কোটলিন এক্সটেনশন

edittext.onDone{/*action*/}আপনার মূল কোডটিতে কেবল কল করতে এটি ব্যবহার করুন । আপনার কোডটিকে আরও বেশি পঠনযোগ্য এবং রক্ষণাবেক্ষণযোগ্য করে তোলে

fun EditText.onDone(callback: () -> Unit) {
    setOnEditorActionListener { _, actionId, _ ->
        if (actionId == EditorInfo.IME_ACTION_DONE) {
            callback.invoke()
            true
        }
        false
    }
}

আপনার সম্পাদনা পাঠ্যে এই বিকল্পগুলি যুক্ত করতে ভুলবেন না

<EditText ...
    android:imeOptions="actionDone"
    android:inputType="text"/>

আপনার যদি inputType="textMultiLine"সমর্থন দরকার হয় তবে এই পোস্টটি পড়ুন


1
দুর্দান্ত উত্তর, ভাগ করে নেওয়ার জন্য ধন্যবাদ! যদিও আমি এর রিটার্ন মানটি সম্পর্কে একটি লিঙ্ক সতর্কতা পেয়ে যাব বলে মনে হচ্ছে setOnEditorActionListener। হয়তো এটা স্থানীয় কনফিগারেশন সেটিংস শুধু একটি ব্যাপার, কিন্তু আমার Linter সত্যিই, সত্যিই আমাকে একটি যুক্ত করতে চায় elseঅর্ডার শ্রোতা (যেমন বিরোধিতা একটি ফিরতি বিবৃতি হিসাবে গ্রহণ করতে "সত্য" খুব শাখা if-block)।
ডিবিএম

0

আপনি যদি অ্যান্ড্রয়েড টিকা ব্যবহার করেন তবে https://github.com/androidannotations/androidannotations

আপনি @ এডিটরএকশন টীকাটি ব্যবহার করতে পারেন

@EditorAction(R.id.your_component_id)
void onDoneAction(EditText view, int actionId){
    if(actionId == EditorInfo.IME_ACTION_DONE){
        //Todo: Do your work or call a method
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.