我完成了聊天主界面的编写(MainActivity)
1. 使用MainActivity直接实现OnClickListener接口,OnPageChangeListener接口
2. 利用ButterKnife注解式绑定控件
@BindView(R.id.view_page)
ViewPager mViewPager;//负责控件翻页(切换)
@BindView(R.id.id_indicator_msg)
ChangeColorIconWithText mIndicatorMsg;//消息
@BindView(R.id.id_indicator_contact)
ChangeColorIconWithText mIndicatorContract;//通讯录
@BindView(R.id.id_indicator_me)
ChangeColorIconWithText mIndicatorMe;//我
3. 初始化Activity实例对象
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStatusBarColor(R.color.app_blue_color);
setContentView(R.layout.activity_main);//定义用户界面
setTitleBar(getString(R.string.app_name),false,false);
ButterKnife.bind(this);
initView();
bindFragment();
initHandler();
getImageArry();
// 开启通知栏,有信息的时候通知
NIMClient.toggleNotification(true);
// 由通知栏点击进入后,用于跳转到指定的聊天界面
// ArrayList<IMMessage> messages = (ArrayList<IMMessage>)
// getIntent().getSerializableExtra(NimIntent.EXTRA_NOTIFY_CONTENT);
// if (messages != null && !messages.isEmpty()){
// IMMessage message = messages.get(0);
// NimUserInfo userInfo = NIMClient.getService(UserService.class)
// .getUserInfo(message.getSessionId());
// Intent intent = new Intent(this,P2PChatActivity.class);
// intent.putExtra("NimUserInfo",userInfo);
// startActivity(intent);
// }
}
4.initView,为事先声明并绑定的view添加onClickListener
private void initView() {
mTabIndicators.add(mIndicatorMsg);
mTabIndicators.add(mIndicatorContract);
mTabIndicators.add(mIndicatorMe);
mIndicatorMsg.setOnClickListener(this);
mIndicatorContract.setOnClickListener(this);
mIndicatorMe.setOnClickListener(this);
mIndicatorMsg.setIconAlpha(1.0f);
}
5.为viewPager加载3个fragment
其中使用FragmentPagerAdapter来处理多fragment页面的横向滑动
private void bindFragment() {
mFragments = new ArrayList<>();
mMsgFragment = new RecentMsgFragment();
mFragments.add(mMsgFragment);
mContractFragment = new ContractFragment();
mFragments.add(mContractFragment);
mMeFragment = new MeFragment();
mFragments.add(mMeFragment);
FragmentPagerAdapter adapter = new FragmentPagerAdapter(getSupportFragmentManager()) {
@Override
public int getCount() {
return mFragments.size();
}
@Override
public Fragment getItem(int position) {
return mFragments.get(position);//获取给定位置对应的fragment
}
};
mViewPager.setAdapter(adapter);//设置适配器
mViewPager.addOnPageChangeListener(this); //添加页面切换时的监听
}
6.初始化所需的handler
private void initHandler() {
NimOnlineStatusHandler.getInstance().init();
NimOnlineStatusHandler.getInstance().setStatusChangeListener(
new NimOnlineStatusHandler.OnStatusChangeListener() {
@Override
public void requestReLogin(String message) {
ToastUtils.showMessage(MainActivity.this,"自动登陆失败或被踢出,请手动登陆~");
startActivity(new Intent(MainActivity.this,LoginActivity.class));
}
@Override
public void networkBroken() {
}
});
NimSysMsgHandler.getInstance().init();
NimFriendHandler.getInstance().init();
NimUserHandler.getInstance().init();
}
其中,
NimOnlineStatusHandler调用接口AuthServiceObserve(用户认证服务观察者接口)
NimSysMsgHandler调用接口SystemMessageObserve(系统通知观察者)
NimFriendHandler调用接口FriendServiceObserve(好友关系变更、黑名单变更通知观察者)
NimUserHandler调用接口UserServiceOberve(用户资料托管接口,提供获取用户资料、修改个人资料等)
(本周还没完成这几个handler的编写)
接口资料获取:https://www.163yun.com/help/documents/18138689637040128(使用网易云通信)
7.重写onClick方法,实现onClickListener接口
@Override
public void onClick(View v) {
resetOtherTabs();
switch (v.getId()) {
case R.id.id_indicator_msg:
mIndicatorMsg.setIconAlpha(1.0f);
mViewPager.setCurrentItem(0, false); //去除mViewPager的滑动效果
break;
case R.id.id_indicator_contact:
mIndicatorContract.setIconAlpha(1.0f);
mViewPager.setCurrentItem(1, false);
break;
case R.id.id_indicator_me:
mIndicatorMe.setIconAlpha(1.0f);
mViewPager.setCurrentItem(2, false);
break;
}
}
8. 按返回键时,将跳转回手机桌面
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
Intent home = new Intent(Intent.ACTION_MAIN); //指定跳到系统桌面
home.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // 清除上一步缓存
home.addCategory(Intent.CATEGORY_HOME);
startActivity(home); //开始跳转
return true;
}
return super.onKeyDown(keyCode, event);
}
9. 当选中某一控件时(消息/联系人/我),其他控件图标均为透明
private void resetOtherTabs() {
for (int i = 0; i < mTabIndicators.size(); i++) {
mTabIndicators.get(i).setIconAlpha(0);
}
}
10.OnPageChangeListener中的两个方法还未实现完:
onPageScrolled(int position, float positionOffset, int positionOffset Pixels):在滑动过程中将一直被调用
onPageSelected(int position):在页面被选中或页面滑动足够距离切换到该页手指抬起时调用
前面声明的ChangeColorIconWithText(继承自View,我想实现在手指滑动时,消息/通讯录/我这三个控件根据滑动程度、距离产生渐变变色效果)也还未实现完