有人可以帮助我使用一些代码片段创建用户定义的侦听器界面吗?
答案 0 :(得分:169)
创建一个新文件:
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");
}
}
答案 1 :(得分:100)
监听器接口
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();
}
}
答案 2 :(得分:8)
我创建了一个Generic AsyncTask Listener,它从AsycTask seperate类获取结果,并使用Interface Callback将其提供给CallingActivity。
$GOPATH/src/me/module/bin/
$GOPATH/src/me/module/pkg/
$GOPATH/src/me/module/src/
<强>接口强>
new GenericAsyncTask(context,new AsyncTaskCompleteListener()
{
public void onTaskComplete(String response)
{
// do your work.
}
}).execute();
<强> GenericAsyncTask 强>
interface AsyncTaskCompleteListener<T> {
public void onTaskComplete(T result);
}
有关详细信息,请查看this,this question。
答案 3 :(得分:6)
创建侦听器界面。
public interface YourCustomListener
{
public void onCustomClick(View view);
// pass view as argument or whatever you want.
}
在另一个活动(或片段)中创建方法setOnCustomClick,您要在其中应用自定义侦听器......
public void setCustomClickListener(YourCustomListener yourCustomListener)
{
this.yourCustomListener= yourCustomListener;
}
从First活动中调用此方法,并传递侦听器接口...
答案 4 :(得分:5)
有4个步骤:
1.创建接口类(监听器)
2.在视图1中使用接口(定义变量)
3.实现视图2的接口(视图2中使用的视图1)
4.在视图1中通过界面查看2
示例:强>
步骤1:您需要创建界面和definde功能
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);
}
}
答案 5 :(得分:1)
在Android中,你可以创建一个接口,如Listener,你的Activity实现它,但我认为这不是一个好主意。 如果我们有许多组件来监听其状态的变化,我们可以创建一个BaseListener实现接口Listener,并使用类型代码来处理它们。 我们可以在创建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);
}
但我认为这不是一个好主意......
答案 6 :(得分:1)
在2018年,不需要听众界面。您已经拥有Android LiveData来处理将所需结果传递回UI组件。
如果我接受Rupesh的回答并调整它以使用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.
}
});
}
}
有关代码示例的更多信息,您可以阅读我的帖子以及官方文档:
答案 7 :(得分:0)
我已经完成了类似的工作,将我的模型类从第二个活动发送到第一个活动。在Rupesh和TheCodeFather的答案的帮助下,我使用LiveData实现了这一目标。
第二活动
public static MutableLiveData<AudioListModel> getLiveSong() {
MutableLiveData<AudioListModel> result = new MutableLiveData<>();
result.setValue(liveSong);
return result;
}
“ liveSong”是全局声明的AudioListModel
在“第一个活动”中调用此方法
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());
}
}
});
可以为像我这样的新探险家提供帮助。
答案 8 :(得分:-4)
采用这种方法的简单方法。首先在Activity类中实现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;
}
}
}