Wie erstelle ich meine eigene Listener-Oberfläche in Android?

134

Könnte mir jemand helfen, eine benutzerdefinierte Listener-Oberfläche mit einigen Codefragmenten zu erstellen?

Rajapandian
quelle

Antworten:

198

Erstellen Sie eine neue Datei:

MyListener.java::

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

Implementieren Sie in Ihrer Aktivität die Schnittstelle:

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

Rufen Sie in Ihrer benutzerdefinierten Klasse bei Bedarf die Schnittstelle auf:

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");
    }
}
Rakesh Soni
quelle
2
So übergeben Sie das Listener-Objekt, wenn sich unser Button bereits im Layout befindet, anstatt den MyButton zu verwenden m = new MyButton (this); Weg, um das Objekt von Button zu erstellen.
Qadir Hussain
2
Sie können eine neue Methode in der MyButton-Klasse hinzufügen: void setMyListener (MyListner m1) {this.ml = m1;} und diese Methode dann jederzeit verwenden, um Ihr Listener-Objekt festzulegen.
Rakesh Soni
1
Wo wird diese Methode in MyLogicToIntimateOthere () verwendet?
abh22ishek
1
Wenn ich dies aus einem iOS-Hintergrund in iOS mache, würde dies zu einem Speicherverlust führen, da der Listener des MyButton eine starke Referenz zum Listener ist und der Listener eine starke Referenz zum MyButton hat ... ist Java Garbage Collector klug genug, um dies zu tun Wissen Sie, dass sowohl der Listener als auch der MyButton bereinigt werden sollten, wenn außer dem MyButton keine Verweise auf den Listener mehr vorhanden sind? Sie könnten WeakReference<>in diesem Fall ein verwenden, aber dann können Sie den Hörer nicht zu einer anonymen Klasse machen oder zu etwas, bei dem der Hörer keine anderen Referenzen hat ... daher wäre es vorzuziehen, es nicht zu verwenden
Fonix
wo MyLogicToIntimateOthers () verwendet
Ab
109

Bitte lesen Sie das Beobachtermuster

Listener-Schnittstelle

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

dann sag in deiner Klasse EventKlasse

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

in Ihrer Fahrerklasse 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();
    }
}
Rupesh
quelle
11

Ich habe einen generischen AsyncTask-Listener erstellt, der das Ergebnis der separaten AsycTask-Klasse abruft und CallingActivity mithilfe des Schnittstellenrückrufs übergibt.

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

Schnittstelle

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

Werfen Sie einen Blick auf diese , diese Frage für weitere Details.

Xar-e-ahmer Khan
quelle
8

Es gibt 4 Schritte:

1.Schnittstellenklasse erstellen (Listener)

2. Verwenden Sie die Schnittstelle in Ansicht 1 (Variable definieren).

3. implementiert die Schnittstelle zu Ansicht 2 (Ansicht 1 wird in Ansicht 2 verwendet)

4. Übergeben Sie die Schnittstelle in Ansicht 1 an Ansicht 2

Beispiel:

Schritt 1: Sie müssen eine Schnittstelle erstellen und eine Funktion definieren

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

Schritt 2: Verwenden Sie diese Schnittstelle in der Ansicht

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

Schritt 3,4: Implementiert die Aktivität

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);
    }
}
Rasoul Miri
quelle
7

Listener-Schnittstelle erstellen.

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

Erstellen Sie die Methode setOnCustomClick in einer anderen Aktivität (oder einem Fragment), in der Sie Ihren benutzerdefinierten Listener anwenden möchten.

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

Rufen Sie diese Methode aus Ihrer ersten Aktivität auf und übergeben Sie die Listener-Oberfläche ...

Kapil Vij
quelle
4

Im Jahr 2018 sind keine Hörerschnittstellen erforderlich. Sie haben Android LiveData, um sicherzustellen, dass das gewünschte Ergebnis an die UI-Komponenten zurückgegeben wird.

Wenn ich Rupeshs Antwort nehme und sie an die Verwendung von LiveData anpasse, wird es so aussehen:

public class Event {

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

         // and in the end

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

und jetzt in Ihrer Treiberklasse 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.
            }
        });
    }
}

Für weitere Informationen zusammen mit Codebeispielen können Sie meinen Beitrag darüber sowie die offiziellen Dokumente lesen:

Wann und warum LiveData verwenden?

Offizielle Dokumente

TheCodeFather
quelle
0

In Android können Sie eine Benutzeroberfläche wie Listener erstellen, die von Ihrer Aktivität implementiert wird. Ich halte dies jedoch nicht für eine gute Idee. Wenn wir viele Komponenten haben, um die Änderungen ihres Status abzuhören, können wir einen BaseListener-Implementierungsschnittstellen-Listener erstellen und Typcode verwenden, um sie zu verarbeiten. Wir können die Methode binden, wenn wir eine XML-Datei erstellen, zum Beispiel:

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

und der Quellcode:

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

aber ich denke nicht, dass es eine gute Idee ist ...

user3055973
quelle
0

Ich habe es wie folgt gemacht, um meine Modellklasse von der zweiten Aktivität zur ersten Aktivität zu senden. Ich habe LiveData verwendet, um dies mithilfe von Antworten von Rupesh und TheCodeFather zu erreichen.

Zweite Aktivität

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

"liveSong" ist AudioListModel, das global deklariert ist

Rufen Sie diese Methode in der ersten Aktivität auf

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

Möge dies neuen Entdeckern wie mir helfen.

Deepak J.
quelle
-4

Einfache Methode, um diesen Ansatz zu tun. Implementiert zunächst das OnClickListenersin Ihrer Aktivitätsklasse.

Code:

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;
        }
    }
}
Rishabh Rawat
quelle