অ্যান্ড্রয়েডে কীভাবে আমাদের নিজস্ব শ্রোতা ইন্টারফেস তৈরি করবেন?


134

কেউ আমাকে কিছু কোড স্নিপেটের সাহায্যে ব্যবহারকারী সংজ্ঞায়িত শ্রোতা ইন্টারফেস তৈরি করতে সহায়তা করতে পারে?

উত্তর:


198

একটি নতুন ফাইল তৈরি করুন:

MyListener.java:

public interface MyListener {
    // you can define any parameter as per your requirement
    public void callback(View view, String result);
}

আপনার ক্রিয়াকলাপে, ইন্টারফেসটি প্রয়োগ করুন:

MyActivity.java:

public class MyActivity extends Activity implements MyListener {
   @override        
   public void onCreate(){
        MyButton m = new MyButton(this);
   }

    // method is invoked when MyButton is clicked
    @override
    public void callback(View view, String result) {   
        // do your stuff here
    }
}

আপনার কাস্টম ক্লাসে, যখন প্রয়োজন হয় ইন্টারফেসটি অনুরোধ করুন:

MyButton.java:

public class MyButton {
    MyListener ml;

    // constructor
    MyButton(MyListener ml) {
        //Setting the listener
        this.ml = ml;
    }

    public void MyLogicToIntimateOthers() {
        //Invoke the interface
        ml.callback(this, "success");
    }
}

2
শ্রোতা অবজেক্টটি কীভাবে পাস করতে হবে যদি আমাদের বাটনটি ইতিমধ্যে লেআউটে থাকে তবে আমরা মাইবাটন এম = নতুন মাইবাটন (এটি) ব্যবহার করি না; বোতামের অবজেক্টটি তৈরি করার উপায়।
কাদির হুসেন

2
আপনি মাইবাটন শ্রেণিতে একটি নতুন পদ্ধতি যুক্ত করতে পারেন: অকার্যকর সেটমাইলাইস্টেনার (মাইলিস্টনার এম 1) {this.ML = m1;} এবং তারপরে আপনার শ্রোতার অবজেক্ট সেট করতে যে কোনও সময় এই পদ্ধতিটি ব্যবহার করুন।
রাকেশ সনি

1
MyLogicToIntimateOthere () এই পদ্ধতিটি কোথায় ব্যবহৃত হয়?
ab22ishek

1
কোনও আইওএসের পটভূমি থেকে আসা, আমি যদি এটি আইওএসে করি তবে এটি একটি স্মৃতি ফাঁস হতে পারে কারণ মাইবুটনের শ্রোতার শ্রোতার একটি দৃ reference় উল্লেখ এবং শ্রোতার কাছে মাইবটনের একটি দৃ reference় উল্লেখ রয়েছে ... জাভা আবর্জনা সংগ্রহকারী যথেষ্ট চালাক মাইবাটন বাদে শ্রোতার কোনও রেফারেন্স না থাকলে শ্রোতা এবং মাইবাটন উভয়ই পরিষ্কার করা উচিত? আপনি একটি ব্যবহার করতে পারে WeakReference<>এই ক্ষেত্রে, কিন্তু তারপর আপনি নাকিসুরে কথা শ্রোতা একটি বেনামী বর্গ কিছু যেখানে শ্রোতা অন্য কোন রেফারেন্স আছে করুন ... তাই এটা বাঞ্ছনীয় হবে এটা ব্যবহার না করার
Fonix

যেখানে MyLogicToIntimateOthers আছে () ব্যবহৃত
এবি

109

অনুগ্রহ করে পর্যবেক্ষক নিদর্শন পড়ুন

শ্রোতা ইন্টারফেস

public interface OnEventListener {
    void onEvent(EventResult er);
    // or void onEvent(); as per your need
}

তারপর আপনার বর্গ বলে এ Eventবর্গ

public class Event {
    private OnEventListener mOnEventListener;

    public void setOnEventListener(OnEventListener listener) {
        mOnEventListener = listener;
    }

    public void doEvent() {
        /*
         * code code code
         */

         // and in the end

         if (mOnEventListener != null)
             mOnEventListener.onEvent(eventResult); // event result object :)
    }
}

আপনার ড্রাইভার ক্লাসে MyTestDriver

public class MyTestDriver {
    public static void main(String[] args) {
        Event e = new Event();
        e.setOnEventListener(new OnEventListener() {
             public void onEvent(EventResult er) {
                 // do your work. 
             }
        });
        e.doEvent();
    }
}

11

আমি একটি জেনেরিক অ্যাসিঙ্কটাস্ক শ্রোতা তৈরি করেছি যা এসাইকটাস্ক পৃথক শ্রেণীর ফলাফল পেয়েছে এবং এটি ইন্টারফেস কলব্যাক ব্যবহার করে কলিংএক্টিভিটিতে দিয়েছি।

new GenericAsyncTask(context,new AsyncTaskCompleteListener()
        {
             public void onTaskComplete(String response) 
             {
                 // do your work. 
             }
        }).execute();

ইন্টারফেস

interface AsyncTaskCompleteListener<T> {
   public void onTaskComplete(T result);
}

GenericAsyncTask

class GenericAsyncTask extends AsyncTask<String, Void, String> 
{
    private AsyncTaskCompleteListener<String> callback;

    public A(Context context, AsyncTaskCompleteListener<String> cb) {
        this.context = context;
        this.callback = cb;
    }

    protected void onPostExecute(String result) {
       finalResult = result;
       callback.onTaskComplete(result);
   }  
}

কটাক্ষপাত আছে এই , এই প্রশ্ন আরো বিস্তারিত জানার জন্য।


8

4 টি পদক্ষেপ রয়েছে:

ইন্টারফেস ক্লাস 1 তৈরি করুন (শ্রোতা)

২ দেখুন ভিউ ইন্টারফেস 1 (পরিবর্তনশীল সংজ্ঞায়িত)

৩. দেখার জন্য প্রয়োজনীয় উপাদানসমূহ ইন্টারফেস (দর্শন 1 দেখুন 2)

4 দেখুন পাসওয়ার্ড ইন্টারফেস 1 দেখতে 2

উদাহরণ:

পদক্ষেপ 1: আপনার ইন্টারফেস তৈরি করতে হবে এবং ফাংশনটি ডিফিন্ড করতে হবে

public interface onAddTextViewCustomListener {
    void onAddText(String text);
}

পদক্ষেপ 2: দেখুন এই ইন্টারফেসটি ব্যবহার করুন

public class CTextView extends TextView {


    onAddTextViewCustomListener onAddTextViewCustomListener; //listener custom

    public CTextView(Context context, onAddTextViewCustomListener onAddTextViewCustomListener) {
        super(context);
        this.onAddTextViewCustomListener = onAddTextViewCustomListener;
        init(context, null);
    }

    public CTextView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init(context, attrs);
    }

    public CTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context, attrs);
    }

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public CTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        init(context, attrs);
    }

    public void init(Context context, @Nullable AttributeSet attrs) {

        if (isInEditMode())
            return;

        //call listener
        onAddTextViewCustomListener.onAddText("this TextView added");
    }
}

পদক্ষেপ 3,4: ক্রিয়াকলাপে প্রয়োগ করা

public class MainActivity extends AppCompatActivity implements onAddTextViewCustomListener {


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

        //get main view from layout
        RelativeLayout mainView = (RelativeLayout)findViewById(R.id.mainView);

        //create new CTextView and set listener
        CTextView cTextView = new CTextView(getApplicationContext(), this);

        //add cTextView to mainView
        mainView.addView(cTextView);
    }

    @Override
    public void onAddText(String text) {
        Log.i("Message ", text);
    }
}

7

শ্রোতা ইন্টারফেস তৈরি করুন।

public interface YourCustomListener
{
    public void onCustomClick(View view);
            // pass view as argument or whatever you want.
}

এবং পদ্ধতি সেটঅনকাস্টম ক্লিক করুন অন্য ক্রিয়াকলাপে (বা টুকরা) ক্লিক করুন, যেখানে আপনি নিজের কাস্টম শ্রোতাদের প্রয়োগ করতে চান ......

  public void setCustomClickListener(YourCustomListener yourCustomListener)
{
    this.yourCustomListener= yourCustomListener;
}

আপনার প্রথম ক্রিয়াকলাপ থেকে এই পদ্ধতিটি কল করুন এবং শ্রোতা ইন্টারফেসটি পাস করুন ...


4

2018 সালে, শ্রোতার ইন্টারফেসের দরকার নেই no পছন্দসই ফলাফলটি ইউআই উপাদানগুলিতে ফেরত দেওয়ার যত্ন নিতে আপনি অ্যান্ড্রয়েড লাইভ ডেটা পেয়েছেন।

আমি যদি রূপেশের উত্তরটি নিয়ে তা লাইভডেটা ব্যবহার করতে সামঞ্জস্য করি তবে এটি পছন্দ করবে:

public class Event {

    public LiveData<EventResult> doEvent() {
         /*
          * code code code
          */

         // and in the end

         LiveData<EventResult> result = new MutableLiveData<>();
         result.setValue(eventResult);
         return result;
    }
}

এবং এখন আপনার ড্রাইভার ক্লাসে MyTestDriver:

public class MyTestDriver {
    public static void main(String[] args) {
        Event e = new Event();
        e.doEvent().observe(this, new  Observer<EventResult>() {
            @Override
            public void onChanged(final EventResult er) {
                // do your work.
            }
        });
    }
}

কোড নমুনার পাশাপাশি আরও তথ্যের জন্য আপনি এটি সম্পর্কে আমার পোস্টটি পড়তে পারেন, পাশাপাশি অফিশিয়াল ডক্সও:

কখন এবং কেন লাইভডেটা ব্যবহার করবেন

অফিসিয়াল ডকস


0

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

<Button  
        android:id="@+id/button4"  
        android:layout_width="match_parent"  
        android:layout_height="wrap_content"  
        android:text="Button4"  
        android:onClick="Btn4OnClick" />

এবং উত্স কোড:

 public void Btn4OnClick(View view) {  
        String strTmp = "点击Button04";  
        tv.setText(strTmp);  
    }  

তবে আমি এটি একটি ভাল ধারণা বলে মনে করি না ...


0

আমার কার্যকলাপের দ্বিতীয় কার্যকলাপ থেকে প্রথম ক্রিয়াকলাপে পাঠানোর জন্য আমি নীচের মতো কিছু করেছি something রূপস এবং থিকোডফ্যাথারের উত্তরগুলির সাহায্যে আমি এটি অর্জনের জন্য লাইভডেটা ব্যবহার করেছি।

দ্বিতীয় ক্রিয়াকলাপ

public static MutableLiveData<AudioListModel> getLiveSong() {
        MutableLiveData<AudioListModel> result = new MutableLiveData<>();
        result.setValue(liveSong);
        return result;
    }

"লাইভসং" হ'ল অডিওলিস্টমোডেল বিশ্বব্যাপী ঘোষণা করা

প্রথম কার্যকলাপে এই পদ্ধতিটি কল করুন

PlayerActivity.getLiveSong().observe(this, new Observer<AudioListModel>() {
            @Override
            public void onChanged(AudioListModel audioListModel) {
                if (PlayerActivity.mediaPlayer != null && PlayerActivity.mediaPlayer.isPlaying()) {
                    Log.d("LiveSong--->Changes-->", audioListModel.getSongName());
                }
            }
        });

এটি আমার মতো নতুন এক্সপ্লোরারদের জন্য সহায়তা করতে পারে।


-4

এই পদ্ধতিটি করার সহজ পদ্ধতি। প্রথমে OnClickListenersআপনার ক্রিয়াকলাপ শ্রেণিতে প্রয়োগ করে ।

কোড:

class MainActivity extends Activity implements OnClickListeners{

protected void OnCreate(Bundle bundle)
{    
    super.onCreate(bundle);    
    setContentView(R.layout.activity_main.xml);    
    Button b1=(Button)findViewById(R.id.sipsi);    
    Button b2=(Button)findViewById(R.id.pipsi);    
    b1.SetOnClickListener(this);    
    b2.SetOnClickListener(this);    
}

public void OnClick(View V)    
{    
    int i=v.getId();    
    switch(i)    
    {    
        case R.id.sipsi:
        {
            //you can do anything from this button
            break;
        }
        case R.id.pipsi:
        {    
            //you can do anything from this button       
            break;
        }
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.