主界面 主要使用ViewPager + Fragment 实现 界面的滑动
消息提示主要使用了github 的开源控件 https://github.com/stefanjauker/BadgeView
1.实现 TopBar 布局
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="40dp" android:paddingLeft="15dp" android:paddingRight="15dp" android:background="#000000" > <LinearLayout android:layout_alignParentLeft="true" android:gravity="center" android:layout_centerVertical="true" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/actionbar_icon"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="微信" android:layout_marginLeft="5dp" android:textColor="#FFFAF0" android:textSize="15dp"/> </LinearLayout> <LinearLayout android:layout_alignParentRight="true" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:layout_centerVertical="true" android:orientation="horizontal"> <ImageView android:layout_width="30dp" android:layout_height="30dp" android:src="@drawable/actionbar_search_icon"/> <ImageView android:layout_width="30dp" android:layout_height="30dp" android:src="@drawable/actionbar_add_icon"/> <ImageView android:layout_width="30dp" android:layout_height="30dp" android:src="@drawable/actionbar_more_icon"/> </LinearLayout> </RelativeLayout>
2.实现选项卡布局
<?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="40dp" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="37dp" android:orientation="horizontal" > <LinearLayout android:id="@+id/ll_chat" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" android:orientation="horizontal" > <TextView android:id="@+id/tv_chat" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:text="聊天" android:textColor="#FFF68F" android:textSize="15sp" /> </LinearLayout> <LinearLayout android:id="@+id/ll_find" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" android:orientation="horizontal" > <TextView android:id="@+id/tv_find" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:text="发现" android:textColor="#000000" android:textSize="15sp" /> </LinearLayout> <LinearLayout android:id="@+id/ll_contact" android:layout_height="match_parent" android:layout_width="0dp" android:layout_weight="1" android:gravity="center" android:orientation="horizontal" > <TextView android:id="@+id/tv_contact" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:text="通信录" android:textColor="#000000" android:textSize="15dp" /> </LinearLayout> </LinearLayout> <ImageView android:id="@+id/tabline_contact" android:layout_width="150dp" android:layout_height="match_parent" android:background="@drawable/abc_ab_transparent_light_holo" /> </LinearLayout>
3.将 TopBar 选项卡 插入到主布局中,使用ViewPager实现滑动效果
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <include layout="@layout/topbar" /> <include layout="@layout/optionbar" /> <android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /> </LinearLayout>
4.分别实现 三个Fragment 的布局,这里只实现一个,其它几个类似 contact_fragment.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20sp" android:text="this is chat fragment"/> </LinearLayout>
5.继承 Fragment 将布局文件填充到Fragment中去
package com.example.weixinui; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class ContactFragment extends Fragment{ @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return inflater.inflate(R.layout.contact_fragment, container, false); } }
6.实现MainActivity 的业务逻辑
package com.example.weixinui; import java.util.ArrayList; import java.util.List; import com.jauker.widget.BadgeView; import android.graphics.Color; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.util.DisplayMetrics; import android.view.Window; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.LinearLayout.LayoutParams; import android.widget.TextView; public class MainActivity extends FragmentActivity { private ViewPager mViewPager; private List<Fragment> mData; private FragmentPagerAdapter mAdapter; private TextView mChatTextView,mFindTextView,mContactTextView; private LinearLayout mChatLinearLayout,mFindLinearLayout,mContactLinearLayout; private BadgeView mChatBadgeView,mFindBadgeView,mContactBadgeView; private ImageView mTabLine; private int screenWidth; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.main); initView(); initTabLine(); } //初始化控件 private void initView() { mChatTextView = (TextView) findViewById(R.id.tv_chat); mFindTextView = (TextView) findViewById(R.id.tv_find); mContactTextView = (TextView) findViewById(R.id.tv_contact); mChatLinearLayout = (LinearLayout) findViewById(R.id.ll_chat); mFindLinearLayout = (LinearLayout) findViewById(R.id.ll_find); mContactLinearLayout = (LinearLayout) findViewById(R.id.ll_contact); mViewPager = (ViewPager) findViewById(R.id.viewpager); mData = new ArrayList<Fragment>(); ChatFragment mChatFragment = new ChatFragment(); ContactFragment mContactFragment = new ContactFragment(); FindFragment mFindFragment = new FindFragment(); mChatBadgeView = new BadgeView(this); mFindBadgeView = new BadgeView(this); mContactBadgeView = new BadgeView(this); mData.add(mChatFragment); mData.add(mContactFragment); mData.add(mFindFragment); mAdapter = new FragmentPagerAdapter(getSupportFragmentManager()) { @Override public int getCount() { return mData.size(); } @Override public Fragment getItem(int arg0) { return mData.get(arg0); } }; mViewPager.setAdapter(mAdapter); mViewPager.setOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageSelected(int position) { resetTextView(); switch (position) { case 0: updateChatLinearLayout(); break; case 1: updateFindLinearLayout(); break; case 2: updateContactLinearLayout(); break; default: break; } } @Override public void onPageScrolled(int pos, float posOffset, int posOffsetPex) { LinearLayout.LayoutParams lp = (LayoutParams)mTabLine.getLayoutParams(); lp.leftMargin = (int) ((pos+posOffset) * screenWidth); mTabLine.setLayoutParams(lp); } @Override public void onPageScrollStateChanged(int arg0) { // TODO Auto-generated method stub } }); } //重置显示文本的颜色 private void resetTextView(){ mChatTextView.setTextColor(Color.BLACK); mFindTextView.setTextColor(Color.BLACK); mContactTextView.setTextColor(Color.BLACK); } //重置BadgeView 显示位置 private void resetBadgeView(){ mChatLinearLayout.removeView(mChatBadgeView); mFindLinearLayout.removeView(mFindBadgeView); mContactLinearLayout.removeView(mContactBadgeView); } private void updateChatLinearLayout() { resetBadgeView(); mChatBadgeView.setBadgeCount(5); mChatLinearLayout.addView(mChatBadgeView); mChatTextView.setTextColor(Color.BLUE); } private void updateFindLinearLayout() { resetBadgeView(); mFindBadgeView.setBadgeCount(5); mFindLinearLayout.addView(mFindBadgeView); mFindTextView.setTextColor(Color.BLUE); } private void updateContactLinearLayout() { resetBadgeView(); mContactBadgeView = new BadgeView(MainActivity.this); mContactBadgeView.setBadgeCount(5); mContactLinearLayout.addView(mContactBadgeView); mContactTextView.setTextColor(Color.BLUE); } //根据屏幕的宽度,初始化引导线的宽度 private void initTabLine() { mTabLine = (ImageView) findViewById(R.id.tabline_contact); DisplayMetrics displayMetrics = new DisplayMetrics(); getWindow().getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); screenWidth = displayMetrics.widthPixels; LinearLayout.LayoutParams lp = (LayoutParams) mTabLine.getLayoutParams(); lp.width = screenWidth / 3; mTabLine.setLayoutParams(lp); } }
效果图: