Birisi, bazı kod parçacıklarıyla kullanıcı tanımlı dinleyici arayüzü oluşturmama yardım edebilir mi?
Birisi, bazı kod parçacıklarıyla kullanıcı tanımlı dinleyici arayüzü oluşturmama yardım edebilir mi?
Yanıtlar:
Yeni bir dosya oluşturun:
MyListener.java:
public interface MyListener {
// you can define any parameter as per your requirement
public void callback(View view, String result);
}
Etkinliğinizde arayüzü uygulayın:
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
}
}
Özel sınıfınızda, gerektiğinde arayüzü çağırın:
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");
}
}
WeakReference<>Bu durumda bir kullanabilirsiniz , ancak o zaman dinleyiciyi anonim bir sınıf veya dinleyicinin başka referansı olmayan herhangi bir şey yapamazsınız ... bu yüzden onu kullanmamak tercih edilir
lütfen gözlemci desenini okuyun
dinleyici arayüzü
public interface OnEventListener {
void onEvent(EventResult er);
// or void onEvent(); as per your need
}
Daha sonra sınıf diyelim de Eventsınıfta
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 :)
}
}
sürücü sınıfında 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();
}
}
AsycTask seperate sınıfından sonuç alan ve Interface Callback kullanarak CallingActivity'ye veren bir Generic AsyncTask Listener oluşturdum.
new GenericAsyncTask(context,new AsyncTaskCompleteListener()
{
public void onTaskComplete(String response)
{
// do your work.
}
}).execute();
Arayüz
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);
}
}
4 adım vardır:
1. arayüz sınıfı (dinleyici) oluşturun
2. görünüm 1'de arayüzü kullanın (değişken tanımlayın)
3. görünüm 2 için arayüz uygular (görünüm 1, görünüm 2'de kullanılır)
4. görünüm 1'den görünüm 2'ye geçiş arabirimi
Misal:
Adım 1: Arayüz ve definde işlevi oluşturmanız gerekir
public interface onAddTextViewCustomListener {
void onAddText(String text);
}
Adım 2: Bu arayüzü görünümde kullanın
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");
}
}
Adım 3,4: Aktiviteye uygular
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);
}
}
Dinleyici arayüzü oluşturun.
public interface YourCustomListener
{
public void onCustomClick(View view);
// pass view as argument or whatever you want.
}
Ve özel dinleyicinizi uygulamak istediğiniz başka bir aktivitede (veya parçada) setOnCustomClick yöntemini oluşturun ......
public void setCustomClickListener(YourCustomListener yourCustomListener)
{
this.yourCustomListener= yourCustomListener;
}
Bu yöntemi İlk etkinliğinizden çağırın ve dinleyici arayüzünü geçin ...
2018 yılında dinleyici arayüzlerine ihtiyaç yoktur. İstenilen sonucu UI bileşenlerine geri iletmek için Android LiveData'ya sahipsiniz.
Rupesh'in cevabını alır ve LiveData'yı kullanacak şekilde ayarlarsam, şöyle olacaktır:
public class Event {
public LiveData<EventResult> doEvent() {
/*
* code code code
*/
// and in the end
LiveData<EventResult> result = new MutableLiveData<>();
result.setValue(eventResult);
return result;
}
}
ve şimdi sürücü sınıfınızda 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.
}
});
}
}
Kod örnekleriyle birlikte daha fazla bilgi için, bu konudaki yazımı ve resmi belgeleri okuyabilirsiniz:
Android'de Dinleyici gibi bir arayüz oluşturabilirsiniz ve Aktiviteniz onu uygular, ancak bunun iyi bir fikir olduğunu düşünmüyorum. durumlarının değişikliklerini dinleyecek çok sayıda bileşenimiz varsa, bir BaseListener arabirim Dinleyicisi uygulayabilir ve bunları işlemek için tür kodunu kullanabiliriz. XML dosyası oluşturduğumuzda yöntemi bağlayabiliriz, örneğin:
<Button
android:id="@+id/button4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button4"
android:onClick="Btn4OnClick" />
ve kaynak kodu:
public void Btn4OnClick(View view) {
String strTmp = "点击Button04";
tv.setText(strTmp);
}
ama bunun iyi bir fikir olduğunu düşünmüyorum ...
Model sınıfımı İkinci Aktiviteden Birinci Aktiviteye göndermek için aşağıdaki gibi bir şey yaptım. Rupesh ve TheCodeFather'dan gelen cevapların yardımıyla bunu başarmak için LiveData kullandım.
İkinci Aktivite
public static MutableLiveData<AudioListModel> getLiveSong() {
MutableLiveData<AudioListModel> result = new MutableLiveData<>();
result.setValue(liveSong);
return result;
}
"liveSong", AudioListModel'in global olarak beyan edilmesidir
İlk Aktivitede bu yöntemi çağırın
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());
}
}
});
Bu benim gibi yeni kaşifler için yardımcı olabilir.
Bu yaklaşımı yapmanın basit yöntemi. Öncelikle OnClickListenersActivity sınıfınızda uygular .
Kod:
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;
}
}
}