android - অ্যানড্রয়েড-একটি সম্পাদনা পাঠ্যতে "প্রবেশ করান" পরিচালনা করুন




android-edittext android-textview (14)

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

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


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

হ্যাঁ।

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

এছাড়াও হ্যাঁ।

আপনি android:imeActionId দেখতে চাইবেন android:imeActionId এবং android:imeOptions গুণাবলী, plus setOnEditorActionListener() পদ্ধতি, সমস্ত setOnEditorActionListener()

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

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

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

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


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

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;
        }
    });

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

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

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

android:inputType="text"

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

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

TextView এ একটি OnEditorActionListener সেট করুন:

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;
    }
});

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


এই depencendy যোগ করুন, এবং এটি কাজ করা উচিত:

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

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

edit.setInputType(InputType.TYPE_CLASS_TEXT);

এই পৃষ্ঠাটি ঠিক কিভাবে এই কাজ করে।

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

android:imeOptions সেট করুন android:imeOptions তারপর আপনি শুধু actionId মধ্যে কর্ম চেক। তাই আপনি imeOptions কে 'actionDone' এ সেট করলে আপনি 'actionId == EditorInfo.IME_ACTION_DONE' এ এডিটর অ্যাকশন-এ চেক করবেন। এছাড়াও, অ্যান্ড্রয়েড সেট করতে ভুলবেন না: ইনপুট টাইপ।

এখানে উল্লিখিত উদাহরণ থেকে EditText:

<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) ফাংশন ব্যবহার করে এই প্রোগ্রামটিিকভাবে সেট করতে পারেন। এখানে লিঙ্কযুক্ত উদাহরণ থেকে OnEditorActionListener এর এখানে রয়েছে:

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;
    }
});

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

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

এখানে একটি সাধারণ স্ট্যাটিক ফাংশন যা আপনি আপনার Utils বা Keyboards ক্লাসে নিক্ষেপ করতে পারেন যা ব্যবহারকারী হার্ডওয়্যার বা সফটওয়্যার কীবোর্ডে রিটার্ন কীটি হিট করলে কোডটি কার্যকর করবে। এটি @ এরিলাস্পারের চমৎকার উত্তরের একটি সংশোধিত সংস্করণ

 /**
 * 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;
        }
    };
}

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

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

কর্ম ঘটনা পুনরাবৃত্তি সম্পর্কে (তথ্য http://developer.android.com/reference/android/view/KeyEvent.html অধিষ্ঠিত) ইত্যাদি সম্পর্কে তথ্যের জন্য http://developer.android.com/reference/android/view/KeyEvent.html দেখুন।


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

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
  }
};

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


পুরোপুরি কাজ

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");

        }
    });
}

}

পুরোপুরি কাজ


     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;
        }
    });

আমার জন্য খুব সূক্ষ্ম কাজ করে
উপরন্তু কীবোর্ড লুকান


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" />






android-textview