পাঠ্য পরিবর্তন শ্রোতার উপর অ্যান্ড্রয়েড


265

আমার একটা পরিস্থিতি আছে, যেখানে দুটি ক্ষেত্র আছে। field1এবং field2। পরিবর্তন করতে field2গেলে field1এবং বিপরীত অবস্থায় আমি যা করতে চাই তা সবই খালি । সুতরাং শেষে কেবলমাত্র একটি ক্ষেত্রে এটিতে সামগ্রী রয়েছে।

field1 = (EditText)findViewById(R.id.field1);
field2 = (EditText)findViewById(R.id.field2);

field1.addTextChangedListener(new TextWatcher() {

   public void afterTextChanged(Editable s) {}

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

   public void onTextChanged(CharSequence s, int start,
     int before, int count) {
      field2.setText("");
   }
  });

field2.addTextChangedListener(new TextWatcher() {

   public void afterTextChanged(Editable s) {}

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

   public void onTextChanged(CharSequence s, int start,
     int before, int count) {
     field1.setText("");
   }
  });

এটা কাজ করে জরিমানা যদি আমি সংযুক্ত addTextChangedListenerকরতে field1শুধুমাত্র কিন্তু যখন আমি উভয় ক্ষেত্র জন্য এটা করতে অ্যাপ ক্র্যাশ। স্পষ্টতই তারা একে অপরকে অনির্দিষ্টকালের জন্য পরিবর্তন করার চেষ্টা করার কারণে। একবার field1পরিবর্তিত হয়ে গেলে এটি field2এই মুহুর্তে পরিষ্কার হয়ে যায় তবে এটি সাফ হয়ে field2যাবে field1এবং আরও ...

কেউ কি কোনও সমাধানের পরামর্শ দিতে পারেন?


নতুন ব্যবহারকারীদের কাছে স্ট্রিংয়ের একটি পর্যবেক্ষণযোগ্য ক্ষেত্র ব্যবহার করে দ্বিপথের ডেটা-বাইন্ডিংয়ের জন্য যান, এখানে প্রদত্ত সমস্ত সমাধান starting waiting blocking gc allocএই ধরণের ত্রুটি তৈরি করতে পারে , যা এমনকি ক্র্যাশ এবং হ্যাং হতে পারে .. সুতরাং ডেটা-বাঁধাইয়ের জন্য যান, এটাই নিরাপদ এবং এখন গুগল দ্বারা প্রস্তাবিত ..
মাইফি উল আসাদ

উত্তর:


460

ক্ষেত্রের পাঠ্যটি খালি না হলে (যেমন দৈর্ঘ্য 0-এর চেয়ে আলাদা হলে) আপনি কেবল পরিষ্কার করতে একটি চেক যোগ করতে পারেন।

field1.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(s.length() != 0)
        field2.setText("");
   }
  });

field2.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(s.length() != 0)
         field1.setText("");
   }
  });

এখানে ডকুমেন্টেশনTextWatcher

এছাড়াও দয়া করে নামকরণের সম্মেলনগুলিকে সম্মান করুন ।


1
সমস্ত ক্ষেত্র পরিবর্তিত হওয়ার পরে কীভাবে সনাক্ত করবেন, কারণ, এটি যখনই পরিবর্তন হয় তখনই এটি সনাক্ত করতে পারে, যখন কোনও বোতাম টিপে রাখা হয়।
রাফায়েল গিমারিস

20

আমি জানি এটি পুরানো তবে কোনও দিন আবার কেউ আবার আসতে পারে।

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

এটা চেষ্টা কর:

Field1 = (EditText)findViewById(R.id.field1);
Field2 = (EditText)findViewById(R.id.field2);

Field1.addTextChangedListener(new TextWatcher() {

   public void afterTextChanged(Editable s) {}

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

   public void onTextChanged(CharSequence s, int start,
     int before, int count) {
      Field2.getText().clear();
   }
  });

Field2.addTextChangedListener(new TextWatcher() {

   public void afterTextChanged(Editable s) {}

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

   public void onTextChanged(CharSequence s, int start,
     int before, int count) {
     Field1.getText().clear();
   }
  });

11

আপনি যদি অ্যান্ড্রয়েড বিকাশের জন্য কোটলিন ব্যবহার করছেন তবে আপনি TextChangedListener()এই কোডটি ব্যবহার করে যুক্ত করতে পারেন :

myTextField.addTextChangedListener(object : TextWatcher{
        override fun afterTextChanged(s: Editable?) {}

        override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}

        override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {}
    })

5

উত্তরের কিছুটা দেরি হলেও এখানে একটি পুনরায় ব্যবহারযোগ্য সমাধান:

/**
 * An extension of TextWatcher which stops further callbacks being called as 
 * a result of a change happening within the callbacks themselves.
 */
public abstract class EditableTextWatcher implements TextWatcher {

    private boolean editing;

    @Override
    public final void beforeTextChanged(CharSequence s, int start, 
                                                    int count, int after) {
        if (editing)
            return;

        editing = true;
        try {
            beforeTextChange(s, start, count, after);
        } finally {
            editing = false;
        }
    }

    protected abstract void beforeTextChange(CharSequence s, int start, 
                                                     int count, int after);

    @Override
    public final void onTextChanged(CharSequence s, int start, 
                                                int before, int count) {
        if (editing)
            return;

        editing = true;
        try {
            onTextChange(s, start, before, count);
        } finally {
            editing = false;
        }
    }

    protected abstract void onTextChange(CharSequence s, int start, 
                                            int before, int count);

    @Override
    public final void afterTextChanged(Editable s) {
        if (editing)
            return;

        editing = true;
        try {
            afterTextChange(s);
        } finally {
            editing = false;
        }
    }

    public boolean isEditing() {
        return editing;
    }

    protected abstract void afterTextChange(Editable s);
}

সুতরাং setText()উপরেরটি ব্যবহার করা হলে, পাঠ্য ওয়াচচারের মধ্যে যে কোনও কলই ঘটবে ফলাফলের ফলে পাঠ্য ওয়াচচারকে আবার কল করা হবে না:

/**
 * A setText() call in any of the callbacks below will not result in TextWatcher being 
 * called again.
 */
public class MyTextWatcher extends EditableTextWatcher {

    @Override
    protected void beforeTextChange(CharSequence s, int start, int count, int after) {
    }

    @Override
    protected void onTextChange(CharSequence s, int start, int before, int count) {
    }

    @Override
    protected void afterTextChange(Editable s) {
    }
}

5

আমিও একই সমস্যার মুখোমুখি stackOverflowহয়েছি এবং ব্যতিক্রমগুলি অব্যাহত রেখেছি এবং আমি নিম্নলিখিত সমাধান নিয়ে আসছি।

edt_amnt_sent.addTextChangedListener(new TextWatcher() {    
    @Override
    public void afterTextChanged(Editable s) {
        if (skipOnChange)
            return;

        skipOnChange = true;
        try {
            //method
        } catch (NumberFormatException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            skipOnChange = false;
        }
    }
});

edt_amnt_receive.addTextChangedListener(new TextWatcher() {

    @Override
    public void afterTextChanged(Editable s) {

        if (skipOnChange)
            return;

        skipOnChange = true;
        try {
            //method
        } catch (NumberFormatException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            skipOnChange = false;
        }
    }
});

প্রাথমিকভাবে ঘোষিত বুলিয়ান skipOnChange = মিথ্যা;


1
"স্ট্যাকের পূর্ণ" আমি মনে করি আপনি গড় স্ট্যাক ওভারফ্লো;)
একজন ড্রয়েড

4

আপনি হ্যাসফোকস () পদ্ধতিটিও ব্যবহার করতে পারেন:

public void onTextChanged(CharSequence s, int start,
     int before, int count) {
     if (Field2.hasfocus()){
         Field1.setText("");
     }
   }

একটি কলেজের অ্যাসাইনমেন্টের জন্য এটি পরীক্ষিত হয়েছি আমি যখন ব্যবহারকারী টাইপ করলাম তখন তাপমাত্রার স্কেলগুলিকে রূপান্তরিত করার জন্য আমি কাজ করছিলাম perfectly


1
EditText.setText সম্পর্কে যখন ব্যবহারকারী এতে প্রবেশ করে?
এডিট টেক্সট

সব থেকে ভালো সমাধান .
সৈয়দ হিশান

3

অন্য সেট করার আগে স্ট্রিং পরীক্ষা করুন EditText খালি করার । যদি Field1খালি থাকে তবে কেন আবার পরিবর্তন করতে হবে ("")? যাতে আপনি s.lenght () বা অন্য কোনও সমাধান দিয়ে আপনার স্ট্রিংয়ের আকার পরীক্ষা করতে পারেন

আর একটি উপায় যা আপনি স্ট্রিংয়ের দৈর্ঘ্য পরীক্ষা করতে পারবেন:

String sUsername = Field1.getText().toString();
if (!sUsername.matches(""))
{
// do your job
}

2

আমি এটির জন্য আমার নিজের এক্সটেনশনটি লিখেছি, এটি আমার জন্য খুব সহায়ক। (Kotlin)

আপনি যেমন লিখতে পারেন:

editText.customAfterTextChanged { editable -> 
    //You have accessed the editable object. 
}

আমার এক্সটেনশন:

fun EditText.customAfterTextChanged(action: (Editable?)-> Unit){
    this.addTextChangedListener(object : TextWatcher {
       override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {}
       override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {}
       override fun afterTextChanged(editable: Editable?) {
        action(editable)
    }
})}

2
editText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }
            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                if (noteid != -1) {
                    MainActivity.notes.set(noteid, String.valueOf(charSequence));
                    MainActivity.arrayAdapter.notifyDataSetChanged();
                }
            }
            @Override
            public void afterTextChanged(Editable editable) {

            }
        });

এই কোডটিতে নোটিডটি মূলত যুক্তিগুলি ফিরিয়ে নেওয়া হয় যা ইন্ডেন্টে স্থাপন করা হয় বা ইন্ডেন্টের মধ্য দিয়ে যায় passed

  Intent intent = getIntent();
         noteid = intent.getIntExtra("noteid", -1);

আপনি আরও পরিষ্কারভাবে বুঝতে চাইলে ডাউনসাইডের কোডটি মূলত অতিরিক্ত কোড।

how to make the menu or insert the menu in our code , 
    create the  menu folder this the folder created by going into the raw
    ->rightclick->
    directory->name the folder as you wish->
    then click on the directory formed->
    then click on new file and then name for file as you wish ie the folder name file
    and now type the 2 lines code in it and see the magic.

সম্পাদনার উদ্দেশ্যে নোটইডিটর.জভা নামে নতুন ক্রিয়াকলাপের কোডটি, আমার অ্যাপ্লিকেশনটি নোট অ্যাপটিকে বেসিক্যাল করছে।

package com.example.elavi.notes;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
import android.widget.Toast;

import static android.media.CamcorderProfile.get;
public class NoteEditorActivity extends AppCompatActivity {
    EditText editText;
    int noteid;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_note_editor);
        editText = findViewById(R.id.editText);
        Intent intent = getIntent();
         noteid = intent.getIntExtra("noteid", -1);
        if (noteid != -1) {
            String text = MainActivity.notes.get(noteid);
            editText.setText(text);

           Toast.makeText(getApplicationContext(),"The arraylist content is"+MainActivity.notes.get(noteid),Toast.LENGTH_SHORT).show();
        }
        else
        {
            Toast.makeText(getApplicationContext(),"Here we go",Toast.LENGTH_SHORT).show();
            MainActivity.notes.add("");
            noteid=MainActivity.notes.size()-1;
        }
        editText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }
            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                if (noteid != -1) {
                    MainActivity.notes.set(noteid, String.valueOf(charSequence));
                    MainActivity.arrayAdapter.notifyDataSetChanged();
                }
            }
            @Override
            public void afterTextChanged(Editable editable) {

            }
        });
    }
}

1

ইন Kotlin কেবল ব্যবহার KTX এক্সটেনশন ফাংশন: (এটা ব্যবহার TextWatcher)

yourEditText.doOnTextChanged { text, start, count, after -> 
        // action which will be invoked when the text is changing
    }


আমদানি core-KTX:

implementation "androidx.core:core-ktx:1.2.0"

1

আমরা কোনও ক্ষেত্রের পাঠ্য সম্পাদনা করার ঠিক আগে টেক্সট ওয়াচারটিকে সরাতে পারি এবং পাঠ্য সম্পাদনা করার পরে এটি আবার যুক্ত করতে পারি।

ফিল্ড 1 এবং ফিল্ড 2 উভয়ের জন্য একটি নাম দেওয়ার জন্য পৃথক ভেরিয়েবল হিসাবে টেক্সট ওয়াচচারগুলি ঘোষণা করুন: যেমন ফিল্ড 1

private TextWatcher Field_1_Watcher = new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    }

    @Override
    public void afterTextChanged(Editable s) {
    }

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

    }

};

তারপর তার নাম ব্যবহার করে প্রহরী যোগ করুন: field1.addTextChangedListener(Field_1_Watcher)জন্য field1 , এবং field2.addTextChangedListener(Field_2_Watcher)জন্য field2

পরিবর্তন করার আগে field2 টেক্সট TextWatcher সরান: field2.removeTextChangedListener(Field_2_Watcher) টেক্সট পরিবর্তন করুন: field2.setText("")

তারপরে আবার টেক্সটওয়াচার যুক্ত করুন: field2.addTextChangedListener(Field_2_Watcher)

অন্যান্য ক্ষেত্রের জন্যও একই কাজ করুন


-3

onCreateপদ্ধতিতে গতিশীল পটভূমি যুক্ত করুন :

getWindow().setBackgroundDrawableResource(R.drawable.background);

এক্সএমএল থেকে পটভূমি অপসারণ করুন।

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