今天Android项目的Bug基本修改完成了,于是就对自己还未了解的回调函数进行了学习。就得到的结果来看,个人觉得回调就像多态一样,比如Boss叫员工去吃饭,但每个员工可能吃不同的食物。只不过,回调是对接口而言。简单来说就是,A对象调用了自己的方法a,方法a接收的参数是B接口的实例b,而在方法a中将执行接口B中的方法c。这样解释可能有点绕不过来,下面我们来看一个例子。
比如宿舍的某个同学设置了一个闹铃,闹铃响时全宿舍的人都能听到,但是张三比较勤奋,听到铃声后起床了,李四比较懒,听到铃声后还要睡会。我们可以把闹铃发出的铃声看作是接口,张三和李四都实现了这个“接口”,闹铃到一定时间后就要“响铃”,响铃就要发出“铃声”,“铃声”就去叫人,至于人会做什么就是人本身的事情。下面看个代码。
1.接口CallPerson
- publicinterface CallPerson {
- publicabstractvoid doCallPerson ();
- }
定义了一个“叫人”的方法。实现这个接口可理解成安装了闹铃。
2.类Zhangsan
- publicclass Zhangsan implements CallPerson {
- String name = "Zhangsan";
- public String getName () {
- return name;
- }
- @Override
- publicvoid doCallPerson() {
- System.out.println(getName() + "听到铃声,勤鸟,起床了!");
- }
- }
3.类Lisi
- publicclass Lisi implements CallPerson {
- String name = "Lisi";
- public String getName () {
- return name;
- }
- @Override
- publicvoid doCallPerson() {
- System.out.println(getName() + "听到铃声,懒猪,没起床!");
- }
- }
4.类Alarm
- publicclass Alarm {
- //响铃
- publicvoid ring (CallPerson callPerson) {
- callPerson.doCallPerson();
- }
- }
5.Activity
然后我们在Activity里模拟闹铃开始响铃
- import android.os.Bundle;
- import android.app.Activity;
- publicclass MainActivity extends Activity {
- @Override
- publicvoid onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.layout_main);
- Alarm alarm = new Alarm();
- Zhangsan zhangsan = new Zhangsan();
- Lisi lisi = new Lisi();
- //模拟闹铃定时时间到,然后响铃
- alarm.ring(zhangsan);
- alarm.ring(lisi);
- }
- }
最后,我们来看看执行的结果
- 12-07 21:49:41.947: INFO/System.out(6107): Zhangsan听到铃声,勤鸟,起床了!
- 12-07 21:49:41.947: INFO/System.out(6107): Lisi听到铃声,懒猪,没起床!
下面是我在项目中的应用
public interface CallTabHost {
LayoutInflater createInflater();
FragmentTabHost createTabhost();
}
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import com.hitler.hitler_n8.bottombar.BottomBar;
import com.hitler.hitler_n8.bottombar.CallTabHost;
import com.hitler.hitler_n8.widget.FragmentTabHost;
public class MainActivity extends AppCompatActivity implements CallTabHost {
private LayoutInflater mInflater;
private FragmentTabHost mTabhost;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
createButtombar();
}
private void createButtombar() {
BottomBar bottomBar = new BottomBar(this);
bottomBar.initTab();
bottomBar.createInflater(this);
bottomBar.createTabhost(this);
}
@Override
public LayoutInflater createInflater() {
mInflater = LayoutInflater.from(this);
return mInflater;
}
@Override
public FragmentTabHost createTabhost() {
mTabhost = (FragmentTabHost) this.findViewById(android.R.id.tabhost);
mTabhost.setup(this, getSupportFragmentManager(), R.id.realtabcontent);
return mTabhost;
}
}
在自定义的Bottombar中
public class BottomBar {
private LayoutInflater mInflater;
private FragmentTabHost mTabhost;
private Context mContext;
private List<Tab> mTabs = new ArrayList<>(3);
public BottomBar(Context context){
mContext = context;
}
/*用FragmentTabHost+Fragment实现底部的导航栏*/
public void initTab() {
Tab tab_home = new Tab(HomeFragment.class, R.string.home, R.drawable.selector_icon_home);
Tab tab_activity = new Tab(ActivityFragment.class, R.string.activity, R.drawable.selector_icon_activity);
Tab tab_mine = new Tab(MineFragment.class, R.string.mine, R.drawable.selector_icon_mine);
mTabs.add(tab_home);
mTabs.add(tab_activity);
mTabs.add(tab_mine);
}
public void createInflater(CallTabHost callTabHost){
mInflater = callTabHost.createInflater();
}
public void createTabhost(CallTabHost callTabHost){
mTabhost = callTabHost.createTabhost();
for (Tab tab : mTabs) {
TabHost.TabSpec tabSpec = mTabhost.newTabSpec(Integer.toString(tab.getTitle()));
tabSpec.setIndicator(buildIndicator(tab));
mTabhost.addTab(tabSpec, tab.getFragment(), null);
}
mTabhost.getTabWidget().setShowDividers(LinearLayout.SHOW_DIVIDER_NONE);
mTabhost.setCurrentTab(0);
}
private View buildIndicator(Tab tab) {
View view = mInflater.inflate(R.layout.tab_indicator, null);
ImageView img = (ImageView) view.findViewById(R.id.icon_tab);
TextView text = (TextView) view.findViewById(R.id.txt_indicator);
img.setBackgroundResource(tab.getIcon());
text.setText(tab.getTitle());
return view;
}
}