অ্যান্ড্রয়েড - একটি সম্পাদনা পাঠ্যে "এন্টার" হ্যান্ডেল করুন


458

আমি ভাবছি যে Enterটাইপ করার সময় ব্যবহারকারী EditTextটিপতে টিপতে হ্যান্ডেল করার কোনও উপায় আছে কিনা , তা হ'ল অন সাবমিট এইচটিএমএল ইভেন্টের মতো।

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


1
: Kotlin & এক্সটেনশনস: একটি চেহারা এখানে stackoverflow.com/a/48810268/1912924
ফ্রান্সিসকো Donzello

উত্তর:


373

আমি ভাবছি যদি কোনও সম্পাদনা Enterপাঠ্য টাইপ করার সময় ব্যবহারকারী টিপতে টিপতে হ্যান্ডেল করার কোনও উপায় আছে তবে এটি অনসামিট এইচটিএমএল ইভেন্টের মতো কিছু আছে।

হ্যাঁ.

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

হ্যাঁ।

আপনি সমস্ত বৈশিষ্ট্য android:imeActionIdএবং android:imeOptionsগুণাবলী, এবং আরও, setOnEditorActionListener()পদ্ধতিটি দেখতে চাইবেনTextView

"সম্পন্ন" বোতামের পাঠ্যকে কাস্টম স্ট্রিংয়ে পরিবর্তন করতে, ব্যবহার করুন:

mEditText.setImeActionLabel("Custom text", KeyEvent.KEYCODE_ENTER);

26
(পিএস এডিটেক্সট টেক্সটভিউ প্রসারিত করে, সুতরাং আপনার যে বৈশিষ্ট্যগুলি দেখতে হবে সেগুলি কেন টেক্সটভিউতে রয়েছে - যখন আমি প্রথমবারের প্রথম বাক্যটি পড়েছিলাম তখন আমি ডাবল-টেক করেছি :))
রিকিট

15
একটি নোট হিসাবে। সমস্ত কীবোর্ড স্ট্যান্ডার্ড অ্যান্ড্রয়েড সমর্থন করে না: imeOptions বৈশিষ্ট্য। যা সত্যিই বিরক্তিকর। উদাহরণস্বরূপ, IME_ACTION_DONE 6 হিসাবে সংজ্ঞায়িত করা হয়েছে, যেখানে এইচটিসি ডিফল্ট কীবোর্ড (অবিশ্বাস্য, ইভো 4 জি এর মতো ফোনে) রিটার্ন কীটি 0 হিসাবে সংজ্ঞায়িত করা হয়েছে
ফার্নফারেট

13
এছাড়াও যদি আপনার imeOptions ব্যবহার করা নিশ্চিত করে আপনি ইনপুট টাইপ = "পাঠ্য" বা অন্য কোনও সমতুল্য ব্যবহার করেন। কীবোর্ড আপনার কথা শুনে! Nexus1
ব্লুন্ডেল

6
"হ্যাঁ" - আপনি কি এর চেয়ে বেশি বর্ণনামূলক হবেন? তিনি সম্ভবত সমাধানটি কীভাবে প্রয়োগ করবেন তা জিজ্ঞাসা করবেন।
আল ওয়াং 21

4
@ আলওয়াং: প্রথমে আপনার উদ্বেগের ক্ষেত্রটি উত্তরে coveredাকা রয়েছে ("আপনি চাইবেন ..." দিয়ে শুরু দেখুন)। দ্বিতীয়ত, এই উত্তরটি ছয় বছর আগে থেকে , এবং সুতরাং কেউ ধরে নিতে পারে যে ওপির সমস্যাটি সমাধান হয়েছিল। সর্বোপরি, ওপি উত্তরটি গ্রহণ করে।
কমন্সওয়্যার

267
final EditText edittext = (EditText) findViewById(R.id.edittext);
edittext.setOnKeyListener(new OnKeyListener() {
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        // If the event is a key-down event on the "enter" button
        if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
            (keyCode == KeyEvent.KEYCODE_ENTER)) {
          // Perform action on key press
          Toast.makeText(HelloFormStuff.this, edittext.getText(), Toast.LENGTH_SHORT).show();
          return true;
        }
        return false;
    }
});

1
কিছু কারণে যখন আমি enterআমার সম্পাদনা পাঠ্যে ক্লিক করি তখন পুরো সম্পাদনা পাঠ্যটি নীচে চলে যায় ... আমি কীভাবে এটি সংশোধন করতে পারি?
রুচির বড়োনিয়া

1
@ রুচিরবারোনিয়া অ্যান্ড্রয়েড যুক্ত করুন: আপনার সম্পাদনা পাঠ্যটিতে ম্যাক্সলাইনস = "1"। আপনার এডিটেক্সটটি "নীচে নামছে" না, বরং প্রবেশ করানো পাঠ্যের মধ্যে একটি লাইন ব্রেক সন্নিবেশ করানো হয়েছে। ম্যাক্সলাইন 1 এ সেট করা লাইন ব্রেকটি beingোকানো থেকে বাধা দেয়।
লুস্টিগ

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

12
CommonsWare, কিন্তু তার RTFM উত্তর দেবার কোন অপরাধ উপায় এই সহজ ঠিক দেখাচ্ছে কিভাবে এটা করবেন উদাহরণ কম দরকারী। ধন্যবাদ!
স্বায়ত্তশাসিত

1
@ অটোনমাস অ্যাপস, আমি প্রায়শই কমন্সওয়্যার উত্তরগুলি দেখতে পাই। ২০০৯ সাল থেকে অ্যান্ড্রয়েড শুরু হওয়ার পর থেকে তিনি উত্তর দিতে ভাগ্যবান। প্রায়শই "হ্যাঁ", "না", "অসম্ভব" এবং এগুলি, সাধারণত কোড ছাড়াই। প্রায়শই তার উত্তরগুলি এখন পুরানো হয়, তাই আমি তার প্রস্তাবগুলি অনুসরণ না করার চেষ্টা করি।
কুলমাইন্ড

215

আপনি যা করেন তা এখানে। এটি অ্যান্ড্রয়েড বিকাশকারী এর নমুনা কোড 'ব্লুটুথ চ্যাট' এও লুকানো আছে। আপনার নিজস্ব ভেরিয়েবল এবং পদ্ধতিগুলির সাহায্যে "উদাহরণ" বলে এমন সাহসী অংশগুলি প্রতিস্থাপন করুন ।

প্রথমে আপনার যা প্রয়োজন তা মূল ক্রিয়ায় আমদানি করুন যেখানে আপনি রিটার্ন বোতামটি বিশেষ কিছু করতে চান:

import android.view.inputmethod.EditorInfo;
import android.widget.TextView;
import android.view.KeyEvent;

এখন, আপনার রিটার্ন কীটির জন্য TextView.OnEditorActionListener টাইপের একটি ভেরিয়েবল তৈরি করুন (এখানে আমি উদাহরণলিস্টনার ব্যবহার করি );

TextView.OnEditorActionListener exampleListener = new TextView.OnEditorActionListener(){

তারপরে আপনাকে রিটার্ন বোতামটি চাপলে কি করবেন সে সম্পর্কে আপনার শ্রোতাদের দুটি জিনিস বলতে হবে। এটা জানা কি editText আমরা যে বিষয়ে কথা বলছি (এখানে আমি ব্যবহার প্রয়োজন exampleView ), এবং তারপর এটি যখন জানতে Enter কী চাপা হয় কি করতে হবে তা দরকার (এখানে, example_confirm () )। এটি যদি আপনার ক্রিয়াকলাপের সর্বশেষ বা একমাত্র সম্পাদনা পাঠ্য হয় তবে এটি আপনার জমা (বা ঠিক আছে, নিশ্চিত করুন, প্রেরণ করুন, সংরক্ষণ করুন) বোতামের জন্য অন ক্লিক পদ্ধতি হিসাবে একই জিনিস করা উচিত।

public boolean onEditorAction(TextView exampleView, int actionId, KeyEvent event) {
   if (actionId == EditorInfo.IME_NULL  
      && event.getAction() == KeyEvent.ACTION_DOWN) { 
      example_confirm();//match this behavior to your 'Send' (or Confirm) button
   }
   return true;
}

অবশেষে, শ্রোতাগুলি সেট করুন (সম্ভবত আপনার অনক্রিট পদ্ধতিতে সম্ভবত);

exampleView.setOnEditorActionListener(exampleListener);

20
ভাল লাগল, আমি EditorInfo.IME_ACTION_SEND ব্যবহার করেছি এবং আমার কাছে অ্যান্ড্রয়েড রয়েছে: imeOptions = এক্সএমএলে "অ্যাকশনসেন্ড"।
বনি

EditorInfo.IME_ACTION_SEND- এর জন্য আমার (এমুলেটর) এর কোনও প্রভাব ছিল না তাই বোকা ট্রাইগার হিসাবে আমি কী-ইভেস্ট.কেইকিওডিকেন্টারও সন্ধান করতাম। এখানে দেখুন: stackoverflow.com/questions/2004344/…
কেউ কোথাও

4
এটি ক্রিয়া সম্পাদন করা ভাল KeyEvent.ACTION_UP। এটির জন্য কাজ করতে জন্য, আপনাকে প্রথম গ্রাস প্রয়োজন ACTION_DOWNইভেন্ট: if (actionId == EditorInfo.IME_NULL && event.getAction() == KeyEvent.ACTION_DOWN) { return true; }। তারপরে আপনি ACTION_UPইভেন্টটি পরীক্ষা করে ক্রিয়াটি করতে পারবেন (উপরের উত্তরের মতো)। আপনি যদি ACTION_DOWNইভেন্টটি গ্রাস না করেন তবে onEditorActionতার জন্য ডাকা হবে না ACTION_UP
ashughes

2
এটিই আমার পক্ষে কাজ করেছে: if (event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) {...}- কাজ করার জন্য অন্য পদ্ধতির কোনওটিই পেল না
জোনাথন এলিস

38

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

import android.view.inputmethod.EditorInfo;
import android.view.KeyEvent;
import android.widget.TextView.OnEditorActionListener;

listener=new TextView.OnEditorActionListener() {
  @Override
  public boolean onEditorAction(TextView view, int actionId, KeyEvent event) {
    if (event==null) {
      if (actionId==EditorInfo.IME_ACTION_DONE);
      // Capture soft enters in a singleLine EditText that is the last EditText.
      else if (actionId==EditorInfo.IME_ACTION_NEXT);
      // Capture soft enters in other singleLine EditTexts
      else return false;  // Let system handle all other null KeyEvents
    }
    else if (actionId==EditorInfo.IME_NULL) { 
    // Capture most soft enters in multi-line EditTexts and all hard enters.
    // They supply a zero actionId and a valid KeyEvent rather than
    // a non-zero actionId and a null event like the previous cases.
      if (event.getAction()==KeyEvent.ACTION_DOWN); 
      // We capture the event when key is first pressed.
      else  return true;   // We consume the event when the key is released.  
    }
    else  return false; 
    // We let the system handle it when the listener
    // is triggered by something that wasn't an enter.


    // Code from this point on will execute whenever the user
    // presses enter in an attached view, regardless of position, 
    // keyboard, or singleLine status.

    if (view==multiLineEditText)  multiLineEditText.setText("You pressed enter");
    if (view==singleLineEditText)  singleLineEditText.setText("You pressed next");
    if (view==lastSingleLineEditText)  lastSingleLineEditText.setText("You pressed done");
    return true;   // Consume the event
  }
};

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


আমি যখন জাভা আপগ্রেড করেছি, তখন আমার অ্যান্ড্রয়েড সরঞ্জাম-চেইনটি ভেঙে গেছে। এটি 32-বিট ছিল। আমি সমস্ত কিছু 64-বিট পুনরায় ইনস্টল করেছি এবং আবিষ্কার করেছি যে এখন আরও অনেকগুলি পাবলিক এমুলেটর সংস্করণ উপলব্ধ। আমাকে অবশ্যই স্বীকার করতে হবে যে আমি কেবল জানি যে EditorActionListener এর আচরণ আমি যে অনুকরণকারী পরীক্ষা করেছি তার সাথে সামঞ্জস্যপূর্ণ।
আর্লক্যাস্পার

আমি যখন এটি আমার ব্লগে পোস্ট করেছি, তখন কেউ মন্তব্য করেছে যে এটি গ্রহণের জন্য এটি কাজ করতে আপনার অ্যান্ড্রয়েড যুক্ত করে: ডিফল্ট আইমে ক্রিয়াটি পরিবর্তন করতে হবে: imeOptions = "অ্যাকশনগো"।
কানের ক্যাস্পার

ওফ আমি আমার ব্লগ পোস্টে মন্তব্যটি ভুলভাবে লিখেছি। এটি গ্রহণের জন্য কাজ করতে, আপনাকে অ্যান্ড্রয়েড যুক্ত করতে: ডিফল্ট আইমে ক্রিয়াটি পরিবর্তন করতে হবে: imeOptions = "অ্যাকশনগো"। এক্সএমএল লেআউটে 'editText' এ to
কানের ক্যাস্পার

আরও প্রতিবিম্বের উপর আমার শেষ মন্তব্যটি পিঁপড়া
এবংগ্রহণ

27

এই পৃষ্ঠাটি ঠিক কীভাবে এটি করবে তা বর্ণনা করে।

https://developer.android.com/training/keyboard-input/style.html

অ্যান্ড্রয়েড সেট করুন : imeOptions তারপরে আপনি কেবল অ্যাকশনআইডি চেক করুন । সুতরাং আপনি যদি 'অ্যাকশনডোন' এ imeOptions সেট করেন তবে আপনি 'এডিটরঅ্যাকশন'-এ' ক্রিয়াকলাপ == EditorInfo.IME_ACTION_DONE 'পরীক্ষা করে দেখুন। এছাড়াও, অ্যান্ড্রয়েড: ইনপুটটাইপ সেট করতে ভুলবেন না।

উপরে লিঙ্কিত উদাহরণ থেকে সম্পাদনা পাঠ্য এখানে:

<EditText
    android:id="@+id/search"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:hint="@string/search_hint"
    android:inputType="text"
    android:imeOptions="actionSend" />

আপনি setImeOptions (int) ফাংশনটি ব্যবহার করে এই প্রোগ্রামটিমেটিকভাবে সেট করতে পারেন । উপরে লিঙ্কিত উদাহরণ থেকে এখানে অনিডিটরঅ্যাকশনলিস্টনার:

EditText editText = (EditText) findViewById(R.id.search);
editText.setOnEditorActionListener(new OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        boolean handled = false;
        if (actionId == EditorInfo.IME_ACTION_SEND) {
            sendMessage();
            handled = true;
        }
        return handled;
    }
});

21

আমি জানি এটি এক বছরের পুরনো, তবে আমি সবেমাত্র আবিষ্কার করেছি এটি একটি সম্পাদনা পাঠের জন্য সঠিকভাবে কাজ করে।

EditText textin = (EditText) findViewById(R.id.editText1);
textin.setInputType(InputType.TYPE_CLASS_TEXT);

এটি পাঠ্য এবং স্থান ব্যতীত অন্য কোনও কিছুই প্রতিরোধ করে। আমি ট্যাব, "রিটার্ন" ("anything n"), বা কিছুই করতে পারি না।


IME_ACTION_DONE
htafoya

1
আপনি যদি "এন্টার" কী অক্ষম করতে চান তবে পুরোপুরি সূক্ষ্মভাবে কাজ করে।
ডিসি

16

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

if (actionId == EditorInfo.IME_NULL && event.getAction() == KeyEvent.ACTION_DOWN)
{
    // your code here
}

ক্রিয়াকলাপ পুনরায় ঘটনার পুনরুক্তি সম্পর্কিত তথ্যের জন্য http://developer.android.com/references/android/view/KeyEvent.html দেখুন enter


16

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

সুতরাং এখানে আমার সমাধান:

এক্সএমএলে টেক্সটভিউয়ের ইনপুট প্রকারের বৈশিষ্ট্যটি "পাঠ্যে" সেট করুন:

android:inputType="text"

কীবোর্ডে "এন্টার" কী এর লেবেলটি কাস্টমাইজ করুন:

myTextView.setImeActionLabel("Custom text", KeyEvent.KEYCODE_ENTER);

টেক্সটভিউতে একটি অনএডিটরঅ্যাকশনলিস্টনার সেট করুন:

myTextView.setOnEditorActionListener(new OnEditorActionListener()
{
    @Override
    public boolean onEditorAction(TextView v, int actionId,
        KeyEvent event)
    {
    boolean handled = false;
    if (event.getAction() == KeyEvent.KEYCODE_ENTER)
    {
        // Handle pressing "Enter" key here

        handled = true;
    }
    return handled;
    }
});

আমি আশা করি এটি আমার অন্যান্য সমস্যাগুলি এড়াতে অন্যকে সহায়তা করতে পারে, কারণ তারা প্রায় আমাকে বাদাম চালিয়েছিল।


দুর্ভাগ্যক্রমে এটি সুইফটকের নতুন সংস্করণ 4 এর সাথে কাজ করছে না। এবং এটি আমাকে আবার বাদাম চালাচ্ছে ...: - /
কওলিক

3
আপনার আইএফ ভুল আছে। ব্যবহার করুন: 'ইভেন্ট.getKeyCode () == কীএভেন্ট.কি.ইইসিডোডেন্টার'
লোডা

আমার জন্য একদম সঠিক. এছাড়াও আইএফ স্টেটমেন্টে আবার সেটআইমিএকশনএলবেল toোকাতে মনে রাখবেন অন্যথায় প্রথম প্রেসের পরে কাস্টম পাঠ্য অদৃশ্য হয়ে যায়।
স্টিভ রজার্স

তার আইএফটি সঠিক, কারণ তিনি উপরে তার কীডেন্ট.কি.এইসিডোয়েন্টিএনটিআর-তে সেট করেছেন :- ডি, তবে হ্যাঁ প্রত্যেকেই সম্ভবত ইভেন্ট.গেটকোডোড () == কী
রায় হুলা

15

আপনার এক্সএমএলে, এডিটেক্সটটিতে আইমপশন বৈশিষ্ট্য যুক্ত করুন

<EditText
    android:id="@+id/edittext_additem"
    ...
    android:imeOptions="actionDone"
    />

তারপরে, আপনার জাভা কোডে, একই সম্পাদনা পাঠ্যে OnEditorActionListener যুক্ত করুন

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

এখানে ব্যাখ্যাটি দেওয়া আছে- imeOptions = অ্যাকশনডোন এন্টারকিকে "অ্যাকশনডোন" বরাদ্দ করবে। কীবোর্ডের এন্টারকি কী "এন্টার" থেকে "সম্পন্ন" হয়ে যাবে। সুতরাং যখন কী কী টিপিত হয়, এটি এই ক্রিয়াকে ট্রিগার করবে এবং এভাবে আপনি এটি পরিচালনা করবেন।


9

আপনি এটি করতে পারেন ..

editText.setOnKeyListener(new OnKeyListener() {

            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event)
            {
                if (event.getAction() == KeyEvent.ACTION_DOWN
                        && event.getKeyCode() ==       KeyEvent.KEYCODE_ENTER) 
                {
                    Log.i("event", "captured");

                    return false;
                } 

            return false;
        }
    });

কিছু কারণে যখন আমি enterআমার সম্পাদনা পাঠ্যে ক্লিক করি তখন পুরো সম্পাদনা পাঠ্যটি নীচে চলে যায় ... আমি কীভাবে এটি সংশোধন করতে পারি?
রুচির বড়োনিয়া

আমার মনে হয় আপনি শিখতে চান stackoverflow.com/questions/10978038/... আমাকে তোমার XML দেন othewise
জাওয়াদ Zeb

6
     password.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if(event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) {
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
                submit.performClick();
                return true;
            }
            return false;
        }
    });

আমার জন্য খুব সূক্ষ্ম কাজ করে
হাইড কীবোর্ড ছাড়াও


5

প্রথমে আপনাকে সম্পাদনা পাঠ্য কী চাপতে হবে সেট করতে হবে

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main); 

    // Set the EditText listens to key press
    EditText edittextproductnumber = (EditText) findViewById(R.id.editTextproductnumber);
    edittextproductnumber.setOnKeyListener(this);

}

দ্বিতীয়ত, ইভেন্টটি কী টিপে সংজ্ঞায়িত করুন, উদাহরণস্বরূপ, টেক্সটভিউয়ের পাঠ্য সেট করার ইভেন্ট:

@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
    // TODO Auto-generated method stub

 // Listen to "Enter" key press
 if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER))
 {
     TextView textviewmessage = (TextView) findViewById(R.id.textViewmessage);
     textviewmessage.setText("You hit 'Enter' key");
     return true;
 }

return false;   

}

এবং পরিশেষে, সম্পাদনা পাঠ্য, পাঠ্যদর্শন, অনকিয়েলিস্টনার, শীর্ষে কীভেন্ট আমদানি করতে ভুলবেন না:

import android.view.KeyEvent;
import android.view.View.OnKeyListener;
import android.widget.EditText;
import android.widget.TextView;

5

নিখুঁতভাবে কাজ

public class MainActivity extends AppCompatActivity {  
TextView t;
Button b;
EditText e;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    b = (Button) findViewById(R.id.b);
    e = (EditText) findViewById(R.id.e);

    e.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

            if (before == 0 && count == 1 && s.charAt(start) == '\n') {

                b.performClick();
                e.getText().replace(start, start + 1, ""); //remove the <enter>
            }

        }
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
        @Override
        public void afterTextChanged(Editable s) {}
    });

    b.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            b.setText("ok");

        }
    });
}

}

নিখুঁতভাবে কাজ


5
editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if (actionId != 0 || event.getAction() == KeyEvent.ACTION_DOWN) {
                // Action
                return true;
            } else {
                return false;
            }
        }
    });

xml

<EditText
        android:id="@+id/editText2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="@string/password"
        android:imeOptions="actionGo|flagNoFullscreen"
        android:inputType="textPassword"
        android:maxLines="1" />

4

এই কাজ করা উচিত

input.addTextChangedListener(new TextWatcher() {

           @Override
           public void afterTextChanged(Editable s) {}

           @Override    
           public void beforeTextChanged(CharSequence s, int start,
             int count, int after) {
           }

           @Override    
           public void onTextChanged(CharSequence s, int start,
             int before, int count) {
               if( -1 != input.getText().toString().indexOf( "\n" ) ){
                   input.setText("Enter was pressed!");
                    }
           }
          });

4

আপনার সম্পাদকে এই কোডটি টাইপ করুন যাতে এটি প্রয়োজনীয় মডিউলগুলি আমদানি করতে পারে।

 query.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView textView, int actionId, KeyEvent keyEvent) {
            if(actionId == EditorInfo.IME_ACTION_DONE
                    || keyEvent.getAction() == KeyEvent.ACTION_DOWN
                        || keyEvent.getAction() == KeyEvent.KEYCODE_ENTER) {

                // Put your function here ---!

                return true;

            }
            return false;
        }
    });

ক্যোরি = সম্পাদনা পাঠের ক্ষেত্রের নাম এবং এডিট টেক্সটের এক্সএমএলে এটি -> (অ্যান্ড্রয়েড: imeOptions = "ক্রিয়া অনুসন্ধান") যুক্ত করুন।
সঞ্জিত প্রসাদ

3

এটি এলজি অ্যান্ড্রয়েড ফোনগুলিতে দুর্দান্ত কাজ করে। এটি বাধা দেয় ENTERএবং অন্যান্য বিশেষ অক্ষরগুলিকে স্বাভাবিক চরিত্র হিসাবে ব্যাখ্যা করা যায়। Nextবা Doneবোতাম স্বয়ংক্রিয়ভাবে এবং মনে হচ্ছে, ENTERআশানুরূপ কাজ করে।

edit.setInputType(InputType.TYPE_CLASS_TEXT);

এটি কেবল আমার জন্য কাজ করেছে। আমার কাছে একটি মোটোরোলা মোটো এক্স 2 রয়েছে এবং সাধারণত এটিতে তীর এবং সমস্ত কিছু সহ "রিটার্ন" কী থাকে। এটি এটিকে একটি চেকমার্কে পরিবর্তন করেছে এবং আমি শ্রোতাদের সাথে এটির সাথে কাজ করতে সক্ষম হয়েছি। (এটি সবেমাত্র একটি নতুন লাইন তৈরি করার আগে)। সুতরাং অন্য কারও যদি সমস্যা হয় ...
রহস্যজনক কোলা

2

এখানে একটি সাধারণ স্ট্যাটিক ফাংশন যা আপনি নিজের Utilsবা Keyboardsক্লাসে ফেলে দিতে পারেন যা যখন ব্যবহারকারী কোনও হার্ডওয়্যার বা সফ্টওয়্যার কীবোর্ডে রিটার্ন কী চাপায় তখন কোড কার্যকর করবে ute এটি @ ইয়ারক্যাস্পারের দুর্দান্ত উত্তরের একটি পরিবর্তিত সংস্করণ

 /**
 * Return a TextView.OnEditorActionListener that will execute code when an enter is pressed on
 * the keyboard.<br>
 * <code>
 *     myTextView.setOnEditorActionListener(Keyboards.onEnterEditorActionListener(new Runnable()->{
 *         Toast.makeText(context,"Enter Pressed",Toast.LENGTH_SHORT).show();
 *     }));
 * </code>
 * @param doOnEnter A Runnable for what to do when the user hits enter
 * @return the TextView.OnEditorActionListener
 */
public static TextView.OnEditorActionListener onEnterEditorActionListener(final Runnable doOnEnter){
    return (__, actionId, event) -> {
        if (event==null) {
            if (actionId == EditorInfo.IME_ACTION_DONE) {
                // Capture soft enters in a singleLine EditText that is the last EditText.
                doOnEnter.run();
                return true;
            } else if (actionId==EditorInfo.IME_ACTION_NEXT) {
                // Capture soft enters in other singleLine EditTexts
                doOnEnter.run();
                return true;
            } else {
                return false;  // Let system handle all other null KeyEvents
            }
        } else if (actionId==EditorInfo.IME_NULL) {
            // Capture most soft enters in multi-line EditTexts and all hard enters.
            // They supply a zero actionId and a valid KeyEvent rather than
            // a non-zero actionId and a null event like the previous cases.
            if (event.getAction()==KeyEvent.ACTION_DOWN) {
                // We capture the event when key is first pressed.
                return true;
            } else {
                doOnEnter.run();
                return true;   // We consume the event when the key is released.
            }
        } else {
            // We let the system handle it when the listener
            // is triggered by something that wasn't an enter.
            return false;
        }
    };
}

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

2

CommonsWare textকী কাজ করতে বলেছে তার জন্য পাঠ্যক্ষেত্রের ইনপুট টাইপ অবশ্যই করা উচিত । এই সমস্ত কিছু চেষ্টা করে দেখুন, পরীক্ষার আগে কোনও ইনপুট টাইপ এবং কিছুই কাজ করেনি, এন্টারটি সফট এন্টার হিসাবে নিবন্ধিত করে রাখে। এরপরে inputType = text, সেটআইমেলবেল সহ সমস্ত কিছুই কাজ করেছিল।

উদাহরণ: android:inputType="text"


2
   final EditText edittext = (EditText) findViewById(R.id.edittext);
    edittext.setOnKeyListener(new OnKeyListener() {
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            // If the event is a key-down event on the "enter" button
            if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
                    (keyCode == KeyEvent.KEYCODE_ENTER)) {
                // Perform action on key press
                Toast.makeText(HelloFormStuff.this, edittext.getText(), Toast.LENGTH_SHORT).show();
                return true;
            }
            return false;
        }
    });

1

একটি <প্রবেশ করান> সাড়া একটি editText মধ্যে একটি নির্ভরযোগ্য ভাবে একটি সাথে আছেন TextWatcher , একটি LocalBroadcastManager , এবং একটি BroadcastReceiver । আপনি যোগ করতে হবে V4 সমর্থন গ্রন্থাগার LocalBroadcastManager ব্যবহার করতে। আমি vogella.com এ টিউটোরিয়ালটি ব্যবহার করি : 7.3 "লোকাল ব্রডকাস্টম্যানেজারের সাথে স্থানীয় সম্প্রচার ইভেন্টগুলি" এর সম্পূর্ণ সংক্ষিপ্ত কোড উদাহরণের কারণে। OnTextChanged ইন সামনে হয় পরিবর্তনের শেষ সূচক পরিবর্তন প্রভাবী হওয়ার আগে >; বিয়োগ শুরু। যখন টেক্সট ওয়াচারে ইউআই থ্রেড সম্পাদনাযোগ্যদের সম্পাদনাযোগ্য আপডেট করতে ব্যস্ত থাকে, তাই যখন ইউআই থ্রেডটি সম্পাদনা পাঠ্য আপডেট করার কাজ করা হয় তখন আমরা ব্রডকাস্টক্সিভারটি জাগ্রত করার জন্য একটি ইন্টেন্ট প্রেরণ করি।

import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.text.Editable;
//in onCreate:
editText.addTextChangedListener(new TextWatcher() {
  public void onTextChanged
  (CharSequence s, int start, int before, int count) {
    //check if exactly one char was added and it was an <enter>
    if (before==0 && count==1 && s.charAt(start)=='\n') {
    Intent intent=new Intent("enter")
    Integer startInteger=new Integer(start);
    intent.putExtra("Start", startInteger.toString()); // Add data
    mySendBroadcast(intent);
//in the BroadcastReceiver's onReceive:
int start=Integer.parseInt(intent.getStringExtra("Start"));
editText.getText().replace(start, start+1,""); //remove the <enter>
//respond to the <enter> here

যদি কোনও পাঠ্য * ইনপুট প্রকার (যেমন android:inputType="textCapSentences") ব্যবহার করে থাকে তবে ক্যারিজ-রিটার্নগুলি ইনপুট থেকে ফিল্টার করা হয় তাই অন্টেক্সট চেঞ্জড () ব্যবহারকারী এন্টার কী চাপলে কল হয় না।
jk7

1

বাটারকনিফের সাথে এই প্রশ্নের উত্তর এখনও দেওয়া হয়নি

এক্সএমএল লেআউট করুন

<android.support.design.widget.TextInputLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/some_input_hint">

        <android.support.design.widget.TextInputEditText
            android:id="@+id/textinput"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:imeOptions="actionSend"
            android:inputType="text|textCapSentences|textAutoComplete|textAutoCorrect"/>
    </android.support.design.widget.TextInputLayout>

জাভা অ্যাপ

@OnEditorAction(R.id.textinput)
boolean onEditorAction(int actionId, KeyEvent key){
    boolean handled = false;
    if (actionId == EditorInfo.IME_ACTION_SEND || (key.getKeyCode() == KeyEvent.KEYCODE_ENTER)) {
        //do whatever you want
        handled = true;
    }
    return handled;
}

টেক্সটইনপুটআউট এবং বাটারনিফ: উইন!
জাভি

1

কোটলিন ব্যবহার করে আমি একটি ফাংশন তৈরি করেছি যা কীবোর্ড সহ এডিটেক্সট এর জন্য সমস্ত ধরণের "সম্পন্ন" -র মতো ক্রিয়া পরিচালনা করে এবং এটিকে সংশোধন করা এবং আপনার ইচ্ছামত অন্যান্য কীগুলিও পরিচালনা করা সম্ভব:

private val DEFAULT_ACTIONS_TO_HANDLE_AS_DONE_FOR_EDIT_TEXT = arrayListOf(EditorInfo.IME_ACTION_SEND, EditorInfo.IME_ACTION_GO, EditorInfo.IME_ACTION_SEARCH, EditorInfo.IME_ACTION_DONE)
private val DEFAULT_KEYS_TO_HANDLE_AS_DONE_FOR_EDIT_TEXT = arrayListOf(KeyEvent.KEYCODE_ENTER, KeyEvent.KEYCODE_NUMPAD_ENTER)

fun EditText.setOnDoneListener(function: () -> Unit, onKeyListener: OnKeyListener? = null, onEditorActionListener: TextView.OnEditorActionListener? = null,
                               actionsToHandle: Collection<Int> = DEFAULT_ACTIONS_TO_HANDLE_AS_DONE_FOR_EDIT_TEXT,
                               keysToHandle: Collection<Int> = DEFAULT_KEYS_TO_HANDLE_AS_DONE_FOR_EDIT_TEXT) {
    setOnEditorActionListener { v, actionId, event ->
        if (onEditorActionListener?.onEditorAction(v, actionId, event) == true)
            return@setOnEditorActionListener true
        if (actionsToHandle.contains(actionId)) {
            function.invoke()
            return@setOnEditorActionListener true
        }
        return@setOnEditorActionListener false
    }
    setOnKeyListener { v, keyCode, event ->
        if (onKeyListener?.onKey(v, keyCode, event) == true)
            return@setOnKeyListener true
        if (event.action == KeyEvent.ACTION_DOWN && keysToHandle.contains(keyCode)) {
            function.invoke()
            return@setOnKeyListener true
        }
        return@setOnKeyListener false
    }
}

সুতরাং, নমুনা ব্যবহার:

        editText.setOnDoneListener({
            //do something
        })

লেবেল পরিবর্তন করার ক্ষেত্রে, আমি মনে করি এটি কীবোর্ড অ্যাপের উপর নির্ভর করে এবং এটি সাধারণত এখানে কেবলমাত্র ল্যান্ডস্কেপে পরিবর্তিত হয় । যাইহোক, উদাহরণস্বরূপ এর ব্যবহার:

        editText.imeOptions = EditorInfo.IME_ACTION_DONE
        editText.setImeActionLabel("ASD", editText.imeOptions)

অথবা, আপনি যদি এক্সএমএলটিতে চান:

    <EditText
        android:id="@+id/editText" android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:imeActionLabel="ZZZ" android:imeOptions="actionDone" />

এবং ফলাফল (আড়াআড়ি দেখানো):

এখানে চিত্র বর্ণনা লিখুন



0

Kotlin

editTextVar?.setOnKeyListener { v, keyCode, event ->
            if((event.action == KeyEvent.ACTION_DOWN)
                && (event.keyCode == KeyEvent.KEYCODE_ENTER)){
                //Do something, such as loadJob()
                loadJob()
                return@setOnKeyListener true
            }

            false
        }

0

ব্যবহারকারী যখন রিটার্ন কী টিপবে তখন এটি আপনাকে কলযোগ্য ফাংশন দেবে।

fun EditText.setLineBreakListener(onLineBreak: () -> Unit) {
    val lineBreak = "\n"
    doOnTextChanged { text, _, _, _ ->
        val currentText = text.toString()

        // Check if text contains a line break
        if (currentText.contains(lineBreak)) {

            // Uncommenting the lines below will remove the line break from the string
            // and set the cursor back to the end of the line

            // val cleanedString = currentText.replace(lineBreak, "")
            // setText(cleanedString)
            // setSelection(cleanedString.length)

            onLineBreak()
        }
    }
}

ব্যবহার

editText.setLineBreakListener {
    doSomething()
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.