记录一下Android中使用回调方法,用最简单的示例和文字说明问题。
Android回调方法指的是:在A类中定义方法(这个方法指的是接口中的抽象方法),但在A类中不实现。在B类中实现这个方法,但在B类中不调用。这个方法在A类中调用。
下文中MainActivity表示A类,View表示B类。
首先在MainActivity中定义这个接口和这个接口中的抽象方法。
public interface CallBack { void work(); }在MainActivity中写其它类可以新建接口对象的方法。(目的是为了让其它更多的类可以定义这个接口的对象)
public void setCallBack(CallBack callBack) { mCallBack = callBack; }在View类中实现这个接口方法
MainActivity mMainActivity;
mMainActivity = new MainActivity(); mMainActivity.setCallBack(new MainActivity.CallBack() { @Override public void work() { Log.i("main", "onClick"); } });在MainActivity中写调用这个接口中的方法(View类中已经实现)
public void doWork() { mCallBack.work(); }在MainActivity中设置一个按钮的点击事件,来验证这个回调方法是否写正确
Button mBtnText;
mBtnText = (Button) findViewById(R.id.btnText);
mBtnText.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { doWork(); } });由于要验证回调方法是否写正确,所以要运行View类,不能只运行MainActivity,所以在Manifest中设置先运行View类,所有的代码如下所示:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.baidu.text03"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> </activity> <activity android:name=".view"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
package com.baidu.text03; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; public class MainActivity extends AppCompatActivity { public static CallBack mCallBack; Button mBtnText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); initClickListener(); } private void initClickListener() { mBtnText.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { doWork(); } }); } private void initView() { mBtnText = (Button) findViewById(R.id.btnText); } public interface CallBack { void work(); } public void setCallBack(CallBack callBack) { mCallBack = callBack; } public void doWork() { mCallBack.work(); } }
package com.baidu.text03; import android.content.Intent; import android.os.Bundle; import android.os.PersistableBundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.Toast; /** * Created by Administrator on 2017/10/8. */ public class view extends AppCompatActivity{ MainActivity mMainActivity; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initListener(); startActivity(new Intent(this, MainActivity.class)); } private void initListener() { mMainActivity = new MainActivity(); mMainActivity.setCallBack(new MainActivity.CallBack() { @Override public void work() { Log.i("main", "onClick"); } }); } }
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:id="@+id/btnText" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="onClick" /> </LinearLayout>注意:在MainAcitivity中定义CallBack的对象时,要使用static,不然会报空指针异常。
public static CallBack mCallBack;