Android – SetOnClickListener vs OnClickListener vs View.OnclickListener

Mijn begrip is dat wanneer ik een knoopobject maak dat luistert voor een klik, moet ik:

  1. Maak het knopobject
  2. Gebruik OnClickListnerom het te luisteren naar de klik
  3. Gebruik onClickOm acties uit te voeren nadat de gebruiker op de knop klikt

Nu,

  • Waar doet setOnClickListenerpassen in de bovenstaande logica?
  • welke men eigenlijk naar de knop luistert klikken?
  • setOnClickListener?
  • OnClickListener?
  • View.OnClickListener?
  • Wat zijn de verschillen tussen die drie?

Hier vond ik in Android Dev:

//The example below shows how to register an on-click listener for a Button.
// Create an anonymous implementation of OnClickListener
private OnClickListener mCorkyListener = new OnClickListener() {
    public void onClick(View v) {
      // do something when the button is clicked
    }
};
protected void onCreate(Bundle savedValues) {
    ...
    // Capture our button from layout
    Button button = (Button)findViewById(R.id.corky);
    // Register the onClick listener with the implementation above
    button.setOnClickListener(mCorkyListener);
    ...
}

U kunt het ook handiger vinden om OnClickListenerte implementeren als onderdeel van uw Activity. Dit vermijdt de extra klassenlast- en object-toewijzingen. Bijvoorbeeld:

public class ExampleActivity extends Activity implements OnClickListener {
    protected void onCreate(Bundle savedValues) {
        ...
         Button button = (Button)findViewById(R.id.corky);
         button.setOnClickListener(this);
    }
    // Implement the OnClickListener callback
    public void onClick(View v) {
      // do something when the button is clicked
    }
}

Antwoord 1, autoriteit 100%

De logica is eenvoudig. setOnClickListenerhoort bij stap 2.

  1. U maakt de knop
  2. U maakt een instantie van OnClickListener* zoals in dat voorbeeld is gedaan en overschrijft de onClick-methode.
  3. Je wijst die OnClickListenertoe aan die knop met behulp van btn.setOnClickListener(myOnClickListener);in je fragmenten/activiteiten onCreate-methode.
  4. Als de gebruiker op de knop klikt, wordt de functie onClickvan de toegewezen OnClickListeneraangeroepen.

*Als u import android.view.View;importeert, gebruikt u View.OnClickListener. Als je import android.view.View.*;of import android.view.View.OnClickListener;importeert, gebruik je voor zover ik weet OnClickListenerhet.

Een andere manier is om u activiteit/fragment te laten erven van OnClickListener. Op deze manier wijst u uw fragment/activiteit toe als luisteraar voor uw knop en implementeert u onClickals ledenfunctie.


Antwoord 2, autoriteit 96%

Stel je voor dat we bijvoorbeeld 3 knoppen hebben

public class MainActivity extends ActionBarActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // Capture our button from layout
        Button button = (Button)findViewById(R.id.corky);
        Button button2 = (Button)findViewById(R.id.corky2);
        Button button3 = (Button)findViewById(R.id.corky3);
        // Register the onClick listener with the implementation above
        button.setOnClickListener(mCorkyListener);
        button2.setOnClickListener(mCorkyListener);
        button3.setOnClickListener(mCorkyListener);
    }
    // Create an anonymous implementation of OnClickListener
    private View.OnClickListener mCorkyListener = new View.OnClickListener() {
        public void onClick(View v) {
            // do something when the button is clicked 
            // Yes we will handle click here but which button clicked??? We don't know
        }
    };
}

Dus wat we doen?

public class MainActivity extends ActionBarActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // Capture our button from layout
        Button button = (Button)findViewById(R.id.corky);
        Button button2 = (Button)findViewById(R.id.corky2);
        Button button3 = (Button)findViewById(R.id.corky3);
        // Register the onClick listener with the implementation above
        button.setOnClickListener(mCorkyListener);
        button2.setOnClickListener(mCorkyListener);
        button3.setOnClickListener(mCorkyListener);
    }
    // Create an anonymous implementation of OnClickListener
    private View.OnClickListener mCorkyListener = new View.OnClickListener() {
        public void onClick(View v) {
            // do something when the button is clicked
            // Yes we will handle click here but which button clicked??? We don't know
            // So we will make
            switch (v.getId() /*to get clicked view id**/) {
                case R.id.corky:
                    // do something when the corky is clicked
                    break;
                case R.id.corky2:
                    // do something when the corky2 is clicked
                    break;
                case R.id.corky3:
                    // do something when the corky3 is clicked
                    break;
                default:
                    break;
            }
        }
    };
}

Of we kunnen dit doen:

public class MainActivity extends ActionBarActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // Capture our button from layout
        Button button = (Button)findViewById(R.id.corky);
        Button button2 = (Button)findViewById(R.id.corky2);
        Button button3 = (Button)findViewById(R.id.corky3);
        // Register the onClick listener with the implementation above
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // do something when the corky is clicked
            }
        });
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // do something when the corky2 is clicked
            }
        });
        button3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // do something when the corky3 is clicked
            }
        });
    }
}

Of we kunnen View.OnClickListener implementeren en ik denk dat dit de beste manier is:

public class MainActivity extends ActionBarActivity implements View.OnClickListener {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // Capture our button from layout
        Button button = (Button)findViewById(R.id.corky);
        Button button2 = (Button)findViewById(R.id.corky2);
        Button button3 = (Button)findViewById(R.id.corky3);
        // Register the onClick listener with the implementation above
        button.setOnClickListener(this);
        button2.setOnClickListener(this);
        button3.setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
        // do something when the button is clicked
        // Yes we will handle click here but which button clicked??? We don't know
        // So we will make
        switch (v.getId() /*to get clicked view id**/) {
            case R.id.corky:
                // do something when the corky is clicked
                break;
            case R.id.corky2:
                // do something when the corky2 is clicked
                break;
            case R.id.corky3:
                // do something when the corky3 is clicked
                break;
            default:
                break;
        }
    }
}

Eindelijk zijn er hier geen echte verschillen. Gewoon “Veel beter dan de andere”


Antwoord 3, autoriteit 40%

Houd er rekening mee dat ik omwille van de eenvoud alleen heb verwezen naar het eerste codefragment, d.w.z.

// Create an anonymous implementation of OnClickListener
private OnClickListener mCorkyListener = new OnClickListener() {
    public void onClick(View v) {
      // do something when the button is clicked
    }
};
protected void onCreate(Bundle savedValues) {
    ...
    // Capture our button from layout
    Button button = (Button)findViewById(R.id.corky);
    // Register the onClick listener with the implementation above
    button.setOnClickListener(mCorkyListener);
    ...
}

setOnClickListener(View.OnClickListener l)is een openbare methode van View-klasse. Knopklasse breidt de View-klasse uit en kan daarom bellen setOnClickListener(View.OnClickListener l)-methode.

SETONCLICKLICISTENER REGISTERS EEN CALLBACK DIE WORDEN AANGEVOERD Wanneer de weergave (knop in uw geval) is geklikt. Deze antwoorden moeten uw eerste twee vragen beantwoorden:

1. Waar doet setOnClickListenerpassen in de bovenstaande logica?

ANS. Het registreert een callback wanneer op de knop wordt geklikt. (In de volgende alinea in detail uitgelegd).

2. Welke luistert naar de knop klik?

ANS. setOnClickListenerMETHODE IS DIE DIE EIGEN DIENLEN NAAR DE KNOP KLIK.

Wanneer ik zeg dat het een callback kan registreren die moet worden aangeroepen, wat ik bedoel, is het de View.OnClickListener ldie de invoerparameter voor de methode is. In uw geval is het mCorkyListenervermeld in button.setOnClickListener(mCorkyListener);die vervolgens de methode OnClick(View v)Voert binnen

// Create an anonymous implementation of OnClickListener
private OnClickListener mCorkyListener = new OnClickListener() {
    public void onClick(View v) {
      // do something when the button is clicked
    }
};

Verder gaan, OnClickListeneris een interface-definitie voor een callback die moet worden aangeroepen wanneer op een weergave (knop in uw geval) wordt geklikt. Simpel gezegd, wanneer u op die knop klikt, worden de methoden binnen mCorkyListener(omdat het een implementatie is van OnClickListener) uitgevoerd. Maar OnClickListenerheeft slechts één methode en dat is OnClick(View v). Daarom moet elke actie die moet worden uitgevoerd bij het klikken op de knop binnen deze methode worden gecodeerd.

Nu je weet wat setOnClickListeneren OnClickListenerbetekenen, weet ik zeker dat je zelf onderscheid kunt maken tussen de twee. De derde term View.OnClickListeneris eigenlijk OnClickListenerzelf. De enige reden waarom u View.vooraf heeft, is vanwege het verschil in de import-instructie aan het begin van het programma. Als je alleen import android.view.View;als importstatement hebt, moet je View.OnClickListenergebruiken. Als u een van deze importverklaringen vermeldt:
import android.view.View.*;of import android.view.View.OnClickListener;importeren; u kunt de View.overslaan en gewoon OnClickListener.


Antwoord 4, autoriteit 20%

View is de superklasse voor alle widgets en de OnClickListener-interface behoort tot deze klasse. Alle widgets erven dit. View.OnClickListener is hetzelfde als OnClickListener. U zou de methode onClick (View view) van deze luisteraar moeten overschrijven om de gewenste actie voor uw knop te bereiken.

Als u Android wilt laten luisteren naar klikgebeurtenissen voor een widget, moet u het volgende doen:

widget.setOnClickListener(this); // If the containing class implements the interface
// Or you can do the following to set it for each widget individually
widget.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        // Do something here
    }
});

De parameter ‘Bekijken’ die is doorgegeven in de methode onClick() laat Android gewoon weten dat er op een weergave is geklikt. Het kan een Button of een TextView zijn of iets anders. Het is aan jou om voor elke widget een OnClickListener in te stellen of om eenvoudig de klasse met al deze widgets de interface te laten implementeren. In dit geval heb je een gemeenschappelijke onClick()-methode voor alle widgets en hoef je alleen maar de id te controleren van de weergave die in de methode wordt doorgegeven en die vervolgens te vergelijken met de id voor elk element dat je wilt en actie ondernemen voor dat element.


Antwoord 5, autoriteit 12%

  1. Allereerst is er geen verschil tussen View.OnClickListeneren OnClickListener. Als u View.OnClickListenergewoon rechtstreeks gebruikt, hoeft u niet te schrijven-

    android.view.View.OnClickListener importeren

  2. Je stelt een OnClickListener-instantie in (bijv. myListenergenoemd object) als de luisteraar naar een weergave via setOnclickListener(). Wanneer een click-gebeurtenis wordt geactiveerd, krijgt die myListenereen melding en wordt de onClick(View view)-methode aangeroepen. Daar doen we onze eigen taak.
    Ik hoop dat dit je helpt.

Other episodes