क्या कोई मुझे कुछ कोड स्निपेट्स के साथ उपयोगकर्ता परिभाषित श्रोता इंटरफ़ेस बनाने में मदद कर सकता है?
क्या कोई मुझे कुछ कोड स्निपेट्स के साथ उपयोगकर्ता परिभाषित श्रोता इंटरफ़ेस बनाने में मदद कर सकता है?
जवाबों:
एक नई फ़ाइल बनाएँ:
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");
}
}
WeakReference<>इस मामले में एक का उपयोग कर सकते हैं , लेकिन तब आप श्रोता को एक अनाम वर्ग या ऐसा कुछ भी बना सकते हैं, जहाँ श्रोता के पास कोई अन्य संदर्भ नहीं है ... इसलिए इसका उपयोग नहीं करना बेहतर होगा
कृपया पर्यवेक्षक पैटर्न पढ़ें
श्रोता इंटरफ़ेस
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();
}
}
मैंने एक जेनेरिक AsyncTask श्रोता बनाया है जो AsycTask सेपरेट क्लास से परिणाम प्राप्त करता है और इसे इंटरफ़ेस कॉलबैक का उपयोग करके CallingActivity को देता है।
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);
}
}
4 चरण हैं:
1. बनाएँ इंटरफ़ेस वर्ग (श्रोता)
2. देखें इंटरफ़ेस 1 में परिवर्तन (परिभाषित चर)
3. 2 को देखने के लिए इंटरफ़ेस इंटरफ़ेस (दृश्य 2 में प्रयुक्त 1 देखें)
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);
}
}
श्रोता इंटरफ़ेस बनाएँ।
public interface YourCustomListener
{
public void onCustomClick(View view);
// pass view as argument or whatever you want.
}
और एक अन्य गतिविधि (या टुकड़ा) में विधि setOnCustom क्लिक करें, जहाँ आप अपने कस्टम श्रोता को लागू करना चाहते हैं ......
public void setCustomClickListener(YourCustomListener yourCustomListener)
{
this.yourCustomListener= yourCustomListener;
}
अपनी पहली गतिविधि से इस विधि को कॉल करें, और श्रोता इंटरफ़ेस पास करें ...
2018 के वर्ष में, श्रोताओं के इंटरफेस की कोई आवश्यकता नहीं है। UI घटकों में वांछित परिणाम पास करने का ध्यान रखने के लिए आपको Android LiveData मिला है।
अगर मैं रूपेश का जवाब लूंगा और इसे लाइवडेटा का उपयोग करने के लिए समायोजित करूंगा, तो यह पसंद आएगा:
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.
}
});
}
}
कोड नमूनों के साथ और अधिक जानकारी के लिए आप इसके बारे में मेरी पोस्ट को पढ़ सकते हैं, साथ ही ऑफिशियल डॉक्स:
Android में, आप एक श्रोता जैसे श्रोता बना सकते हैं, और आपकी गतिविधि इसे लागू करती है, लेकिन मुझे नहीं लगता कि यह एक अच्छा विचार है। अगर हमारे पास अपने राज्य के परिवर्तनों को सुनने के लिए कई घटक हैं, तो हम एक बेसलिंटर उपकरण इंटरफ़ेस श्रोता बना सकते हैं, और उन्हें संभालने के लिए टाइप कोड का उपयोग कर सकते हैं। उदाहरण के लिए, XML फ़ाइल बनाते समय हम इस विधि को बाँध सकते हैं:
<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);
}
लेकिन मुझे नहीं लगता कि यह एक अच्छा विचार है ...
मैंने अपने मॉडल वर्ग को दूसरी गतिविधि से पहली गतिविधि तक भेजने के लिए इसे नीचे किया है। मैंने इसे पाने के लिए LiveData का इस्तेमाल किया, रूपेश और TheCodeFather के जवाबों की मदद से।
दूसरी गतिविधि
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());
}
}
});
मेरे जैसे नए खोजकर्ताओं के लिए यह मदद कर सकता है।
इस दृष्टिकोण को करने की सरल विधि। सबसे पहले 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;
}
}
}