ব্যবহারকারী সম্পাদনা পাঠ্য সম্পাদনা শেষ করলে আমি একটি ইভেন্ট ধরতে চাই।
এটা কিভাবে করা যাবে?
override fun afterTextChanged(s: Editable?) { if (s.toString().length == 5) { val enteredString = s.toString() }
ব্যবহারকারী সম্পাদনা পাঠ্য সম্পাদনা শেষ করলে আমি একটি ইভেন্ট ধরতে চাই।
এটা কিভাবে করা যাবে?
override fun afterTextChanged(s: Editable?) { if (s.toString().length == 5) { val enteredString = s.toString() }
উত্তর:
ব্যবহারকারীর সম্পাদনা শেষ হয়ে গেলে, সে টিপবে Done
বাEnter
((EditText)findViewById(R.id.youredittext)).setOnEditorActionListener(
new EditText.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_SEARCH ||
actionId == EditorInfo.IME_ACTION_DONE ||
event != null &&
event.getAction() == KeyEvent.ACTION_DOWN &&
event.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
if (event == null || !event.isShiftPressed()) {
// the user is done typing.
return true; // consume.
}
}
return false; // pass on to other listeners.
}
}
);
আরও ভাল উপায়, আপনি ব্যবহারকারীরা সম্পাদনা করেছেন কিনা তা পরীক্ষা করতে শ্রোতাগুলিতে ফোসকেনচার এডিটেক্সটও ব্যবহার করতে পারেন: (সফট কীবোর্ডের ডোন বা এন্টার বোতাম টিপে ব্যবহারকারী নির্ভর করে না)
((EditText)findViewById(R.id.youredittext)).setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
// When focus is lost check that the text field has valid values.
if (!hasFocus) { {
// Validate youredittext
}
}
});
দ্রষ্টব্য: একাধিক সম্পাদনা পাঠের জন্য, আপনি নিজের শ্রেণিটি কার্যকর করতে দিতে পারেন তবে আপনার View.OnFocusChangeListener
প্রত্যেকেরই সম্পাদনা পাঠ্য শ্রোতাকে সেট করতে এবং নীচের মতো এটিকে বৈধতা দিন
((EditText)findViewById(R.id.edittext1)).setOnFocusChangeListener(this);
((EditText)findViewById(R.id.edittext2)).setOnFocusChangeListener(this);
@Override
public void onFocusChange(View v, boolean hasFocus) {
// When focus is lost check that the text field has valid values.
if (!hasFocus) {
switch (view.getId()) {
case R.id.edittext1:
// Validate EditText1
break;
case R.id.edittext2:
// Validate EditText2
break;
}
}
}
EditText
। এটি কখনই মনোযোগ হারাবে না।
EditText
? আমার কি ব্যবহার করতে হবে onEditorAction
?
EditText
, ব্যবহারকারী স্ক্রিনটি ছেড়ে যা যা করতে তা যাচাই করে নিন।
W/ViewRootImpl: Cancelling event due to no window focus: MotionEvent { action=ACTION_CANCEL, actionButton=0, id[0]=0, x[0]=605.52246, y[0]=969.4336, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=238238, downTime=235422, deviceId=0, source=0x1002 }
টিপতাম ততবারই এটি আমাকে অনুরূপ বার্তা দেয়: যদিও আমি কিছু টাইপ করেছি This এটি এমন একটি সম্পাদনা যা কেবল সংখ্যা গ্রহণ করে।
আমি ব্যক্তিগতভাবে টাইপিং শেষে স্বয়ংক্রিয় জমা দিতে পছন্দ করি। আপনি কীভাবে এই ইভেন্টটি সনাক্ত করতে পারেন তা এখানে।
ঘোষণা এবং সূচনা:
private Timer timer = new Timer();
private final long DELAY = 1000; // in ms
শ্রোতা উদাঃ onCreate ()
EditText editTextStop = (EditText) findViewById(R.id.editTextStopId);
editTextStop.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void onTextChanged(final CharSequence s, int start, int before,
int count) {
if(timer != null)
timer.cancel();
}
@Override
public void afterTextChanged(final Editable s) {
//avoid triggering event when text is too short
if (s.length() >= 3) {
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
// TODO: do what you need here (refresh list)
// you will probably need to use
// runOnUiThread(Runnable action) for some specific
// actions
serviceConnector.getStopPoints(s.toString());
}
}, DELAY);
}
}
});
সুতরাং, পাঠ্য পরিবর্তন করা হলে টাইমার পরবর্তী কোনও পরিবর্তন হওয়ার জন্য অপেক্ষা করতে শুরু করে। যখন এগুলি ঘটে টাইমার বাতিল হয়ে যায় এবং তারপরে আবার শুরু হয়।
Handler
পরিবর্তে ব্যবহার করুন
আপনি সেটঅনকি লাইস্টেনার ব্যবহার করে বা পাঠ্য ওয়াচচার ব্যবহার করে এটি করতে পারেন:
পাঠ্য প্রহরী সেট করুন editText.addTextChangedListener(textWatcher);
তারপরে ফোন করুন
private TextWatcher textWatcher = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
//after text changed
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
};
যদিও অনেক উত্তর সঠিক দিক নির্দেশ করে আমার মনে হয় প্রশ্নটির লেখক কী ভাবছেন সেগুলির কোনও উত্তর দেয় না। বা কমপক্ষে আমি প্রশ্নটি অন্যরকমভাবে বুঝতে পেরেছিলাম কারণ আমি অনুরূপ সমস্যার উত্তর খুঁজছিলাম। সমস্যাটি হল "ব্যবহারকারী কীভাবে তাকে বোতাম টিপে না ফেলে টাইপ করা বন্ধ করে দেয়" কীভাবে তা জানবেন এবং কিছু ক্রিয়াকলাপ ট্রিগার করে (উদাহরণস্বরূপ স্বয়ংক্রিয়-সম্পূর্ণ)। আপনি যদি এটি করতে চান তবে টেক্সট-এ টাইমারটি বিলম্বের সাথে পরিবর্তিত হয়েছিলেন যা আপনি ব্যবহারকারী টাইপ করা বন্ধ করে বিবেচনা করবেন (উদাহরণস্বরূপ 500-700 মিমি), আপনি টাইমার শুরু করার সাথে সাথে প্রতিটি টাইম আগেরটি বাতিল করে দেয় (বা কমপক্ষে কোনও প্রকারের ব্যবহার করুন) ফ্ল্যাগ করুন যে তারা যখন টিক দেয় তখন তারা কিছু করেন না)। এখানে আমি যা ব্যবহার করেছি তার অনুরূপ কোড:
new Timer().schedule(new TimerTask() {
@Override
public void run() {
if (!running) {
new DoPost().execute(s.toString());
});
}
}, 700);
নোট করুন যে আমি আমার অ্যাসিঙ্ক টাস্কের অভ্যন্তরে চলমান বুলিয়ান পতাকাটি সংশোধন করেছি (অটো-সম্পূর্ণ হওয়ার জন্য টাস্ক সার্ভার থেকে জসন পায়)।
এছাড়াও মনে রাখবেন যে এটি অনেকগুলি টাইমার টাস্ক তৈরি করে (আমি মনে করি তারা একই থ্রেডের ভিত্তিতে নির্ধারিত হয়েছে তবে এটি পরীক্ষা করে দেখতে হবে), সম্ভবত উন্নতির জন্য অনেকগুলি জায়গা রয়েছে তবে এই পদ্ধতির কাজও হয় এবং নীচের অংশটি হ'ল আপনার উচিত টাইমার ব্যবহার করুন যেহেতু কোনও "ব্যবহারকারী টাইপ ইভেন্ট বন্ধ করে" নেই
ক্রিয়াকলাপের পরে কী-বোর্ডটি আড়াল করতে চাইলে @ রেনো এবং @ বিনায়াক বি উভয়ই এক সাথে উত্তর দেয়
textView.setOnEditorActionListener(new EditText.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(textView.getWindowToken(), 0);
return true;
}
return false;
}
});
textView.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus) {
// your action here
}
}
});
একটি ভিন্ন পদ্ধতির ... এখানে একটি উদাহরণ: ব্যবহারকারী টাইপ করার সময় যদি 600-1000 মিমি দেরি করে থাকেন তবে আপনি বিবেচনা করতে পারবেন তিনি বন্ধ হয়ে গিয়েছেন।
myEditText.addTextChangedListener(new TextWatcher() {
private String s;
private long after;
private Thread t;
private Runnable runnable_EditTextWatcher = new Runnable() {
@Override
public void run() {
while (true) {
if ((System.currentTimeMillis() - after) > 600)
{
Log.d("Debug_EditTEXT_watcher", "(System.currentTimeMillis()-after)>600 -> " + (System.currentTimeMillis() - after) + " > " + s);
// Do your stuff
t = null;
break;
}
}
}
};
@Override
public void onTextChanged(CharSequence ss, int start, int before, int count) {
s = ss.toString();
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void afterTextChanged(Editable ss) {
after = System.currentTimeMillis();
if (t == null)
{
t = new Thread(runnable_EditTextWatcher);
t.start();
}
}
});
ঠিক আছে এটি নিশ্চিতভাবে 100% কাজ করবে।
কীবোর্ডটি দেখানো বা লুকানো থাকলে প্রথমে আপনাকে শ্রোতাদের সেটআপ করতে হবে। যদি কীবোর্ডটি প্রদর্শিত হয় তবে সম্ভবত ব্যবহারকারী টাইপ করছেন, অন্যথায় টাইপ করা হয়েছে।
final View activityRootView = findViewById(android.R.id.content);
activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect r = new Rect();
//r will be populated with the coordinates of your view that area still visible.
activityRootView.getWindowVisibleDisplayFrame(r);
int heightDiff = activityRootView.getRootView().getHeight() - (r.bottom - r.top);
if (heightDiff > 100) { // if more than 100 pixels, its probably a keyboard...
isTyping = true;
} else {
//to make sure this will call only once when keyboard is hide.
if(isTyping){
isTyping = false;
}
}
}
});
heightDiff > 100
স্টাফ ভীতিজনক imho।
আমি এইভাবে এই সমস্যাটি সমাধান করেছি। আমি কোটলিন ব্যবহার করেছি।
var timer = Timer()
var DELAY:Long = 2000
editText.addTextChangedListener(object : TextWatcher {
override fun afterTextChanged(s: Editable?) {
Log.e("TAG","timer start")
timer = Timer()
timer.schedule(object : TimerTask() {
override fun run() {
//do something
}
}, DELAY)
}
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
Log.e("TAG","timer cancel ")
timer.cancel() //Terminates this timer,discarding any currently scheduled tasks.
timer.purge() //Removes all cancelled tasks from this timer's task queue.
}
})
আমারও একই সমস্যা ছিল এবং সম্পন্ন বা এন্টার টিপে ব্যবহারকারীর উপর নির্ভর করতে চাই না।
আমার প্রথম চেষ্টা ছিল অন ফোকাস চেঞ্জ শ্রোতার ব্যবহার করা, তবে এটি ঘটেছিল যে আমার সম্পাদনা পাঠটি ডিফল্টরূপে ফোকাস পেয়েছে। ব্যবহারকারী যখন অন্য কোনও ভিউ চাপা দেয়, তখন ব্যবহারকারীরা এটিকে ফোকাসটি নির্ধারণ না করেই ফোকাস চেঞ্জটি ট্রিগার করে।
পরবর্তী সমাধানটি এটি আমার জন্য করেছিল, যেখানে ব্যবহারকারী সম্পাদনা পাঠ্য স্পর্শ করলে অনফোকাস চেঞ্জ যুক্ত থাকে:
final myEditText = new EditText(myContext); //make final to refer in onTouch
myEditText.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
myEditText.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if(!hasFocus){
// user is done editing
}
}
}
}
}
আমার ক্ষেত্রে, ব্যবহারকারীর স্ক্রিন সম্পাদনার কাজটি পুনরায় রেন্ডার করা হয়েছিল, যার ফলে আমার এডিটটেক্সট অবজেক্টটি পুনর্নবীকরণ করা হবে। যদি একই অবজেক্টটি রাখা হয়, তবে এই পোস্টের শুরুতে বর্ণিত অনফোকাস চেঞ্জ সমস্যাটি রোধ করতে আপনার সম্ভবত ফোকাস চেঞ্জের শ্রোতাদের অপসারণ করা উচিত remove
চ্যাট অ্যাপে 'এখন টাইপিং' প্রয়োগ করার চেষ্টা করার সময় আমার একই সমস্যা হয়েছিল। নীচে এডিটেক্সট প্রসারিত করার চেষ্টা করুন:
public class TypingEditText extends EditText implements TextWatcher {
private static final int TypingInterval = 2000;
public interface OnTypingChanged {
public void onTyping(EditText view, boolean isTyping);
}
private OnTypingChanged t;
private Handler handler;
{
handler = new Handler();
}
public TypingEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.addTextChangedListener(this);
}
public TypingEditText(Context context, AttributeSet attrs) {
super(context, attrs);
this.addTextChangedListener(this);
}
public TypingEditText(Context context) {
super(context);
this.addTextChangedListener(this);
}
public void setOnTypingChanged(OnTypingChanged t) {
this.t = t;
}
@Override
public void afterTextChanged(Editable s) {
if(t != null){
t.onTyping(this, true);
handler.removeCallbacks(notifier);
handler.postDelayed(notifier, TypingInterval);
}
}
private Runnable notifier = new Runnable() {
@Override
public void run() {
if(t != null)
t.onTyping(TypingEditText.this, false);
}
};
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
@Override
public void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) { }
}
আমি তাকে একই সমস্যার সাথে শেষ করেছি এবং আমি সমাধানটি ওডিটর অ্যাকশন বা ফোকাস চেঞ্জ দিয়ে ব্যবহার করতে পারিনি এবং টাইমার চেষ্টা করতে চাইনি। সমস্ত থ্রেড এবং খুব অবিশ্বাস্যর কারণে একটি টাইমার স্বাদযুক্ত হতে পারে এটির পক্ষে বিপজ্জনক, কারণ আপনার কোডটি কখন কার্যকর করা হয় তা আপনি জানেন না।
অন-এডিটরএকশনটি যখন ব্যবহারকারী কোনও বোতাম ব্যবহার না করে ছেড়ে যায় এবং আপনি যদি এটি ব্যবহার করেন তবে দয়া করে লক্ষ্য করুন যে কী-এভেন্ট নਾਲ হতে পারে। ফোকাস উভয় প্রান্তে অবিশ্বাস্য হয় ব্যবহারকারী কোনও পাঠ্য প্রবেশ না করে বা ক্ষেত্রটি নির্বাচন না করে ফোকাস পেতে এবং ছেড়ে যেতে পারে এবং ব্যবহারকারীর শেষ সম্পাদনা ক্ষেত্রটি ছেড়ে যাওয়ার দরকার নেই need
আমার সমাধান অনফোকাস চেঞ্জ এবং একটি পতাকা সেট ব্যবহার করে যখন ব্যবহারকারী পাঠ্য সম্পাদনা শুরু করে এবং শেষ ফোকাস করা ভিউ থেকে পাঠ্যটি পেতে কোনও ফাংশন, যা আমি যখন প্রয়োজনবোধে কল করি।
আমি কেবল আমার সমস্ত পাঠ্য ক্ষেত্রের উপর ফোকাস সাফ করে দিয়েছি বাম পাঠ্য ভিউ কোডটি ট্র্যাক করতে, ক্লিয়ারফোকাস কোডটি কেবলমাত্র কার্যকর করা হয় যদি ক্ষেত্রটির ফোকাস থাকে। আমি onSaveInstanceState এ ফাংশনটি কল করি তাই আমাকে সম্পাদনা পাঠের দৃশ্যের হিসাবে এবং গুরুত্বপূর্ণ বোতামগুলি ক্লিক করা হয় এবং যখন কার্যকলাপটি বন্ধ থাকে তখন পতাকাটি (এমডিটিং) সংরক্ষণ করতে হবে না।
টেক্সট ওয়াচারের সাথে সতর্ক থাকুন কারণ এটি প্রায়শই কল হয় estআরস্টোরইনস্ট্যান্স স্টেট কোডটি পাঠ্যে প্রবেশ করার সময় আমি প্রতিক্রিয়া না জানাতে ফোকাসের শর্তটি ব্যবহার করি। আমি
final EditText mEditTextView = (EditText) getView();
mEditTextView.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if (!mEditing && mEditTextView.hasFocus()) {
mEditing = true;
}
}
});
mEditTextView.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus && mEditing) {
mEditing = false;
///Do the thing
}
}
});
protected void saveLastOpenField(){
for (EditText view:getFields()){
view.clearFocus();
}
}
আমি এই বিমূর্ত শ্রেণীর মতো কিছু করেছি যা টেক্সটভিউ.অনএডিটরঅ্যাকশনলিস্টনার ধরণের জায়গায় ব্যবহার করা যেতে পারে।
abstract class OnTextEndEditingListener : TextView.OnEditorActionListener {
override fun onEditorAction(textView: TextView?, actionId: Int, event: KeyEvent?): Boolean {
if(actionId == EditorInfo.IME_ACTION_SEARCH ||
actionId == EditorInfo.IME_ACTION_DONE ||
actionId == EditorInfo.IME_ACTION_NEXT ||
event != null &&
event.action == KeyEvent.ACTION_DOWN &&
event.keyCode == KeyEvent.KEYCODE_ENTER) {
if(event == null || !event.isShiftPressed) {
// the user is done typing.
return onTextEndEditing(textView, actionId, event)
}
}
return false // pass on to other listeners
}
abstract fun onTextEndEditing(textView: TextView?, actionId: Int, event: KeyEvent?) : Boolean
}
এডিট টেক্সট এ টাইপিং ফিনিস সহজ
আমার জন্য কাজ করেছেন, যদি আপনি জাভা ব্যবহার করেন তবে এটি রূপান্তর করুন
কোটলিনে
youredittext.doAfterTextChanged { searchTerm ->
val currentTextLength = searchTerm?.length
Handler().postDelayed({
if (currentTextLength == searchTerm?.length) {
// your code
Log.d("aftertextchange", "ON FINISH TRIGGER")
}
}, 3000)
}