摘要
前段時間看到一個大神在Testerhome論壇裡面上傳了自己編寫的TesterHome的代碼,心裡也就下定決定我應該也去試試看,作為android app測試工程師,對于android的一些東西至少還是需要了解的。看了下那位大神的一些代碼,又看了他推薦的編寫代碼的規範,就按照上面的開始編寫吧,是以後面寫的一些内容,可能會有些内容是參考大神的代碼的。
正文
下來今天我們需要完成的是一個TesterHome的界面,基本的界面情況如下:

看這個界面的話,大體就是4個Fragment接着再其中的一個fragment中再嵌套4個fragment就行了。話說的簡單,我們還是來實作下比較好。
首先我們來實作底部的布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:background="#FFFFFF">
<LinearLayout
android:id="@+id/id_community"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="center"
android:padding="2dp"
>
<com.saii.testerhome.views.TintableImageView
android:id="@+id/id_community_img"
android:layout_width="30dp"
android:layout_height="30dp"
android:padding="3dp"
android:src="@drawable/tab_main_home"
app:tint="@color/tab_item_tint_color"/>
<TextView
android:id="@+id/id_community_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
android:text="@string/community"
android:textSize="15sp"
android:textColor="#848484"/>
</LinearLayout>
<LinearLayout
android:id="@+id/id_topic"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="center"
android:padding="2dp"
>
<com.saii.testerhome.views.TintableImageView
android:id="@+id/id_topic_img"
android:layout_width="30dp"
android:layout_height="30dp"
android:padding="3dp"
android:src="@drawable/tab_main_topic"
app:tint="@color/tab_item_tint_color"/>
<TextView
android:id="@+id/id_topic_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
android:text="@string/topic"
android:textSize="15sp"
android:textColor="#848484"/>
</LinearLayout>
<LinearLayout
android:id="@+id/id_job"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="center"
android:padding="2dp"
>
<com.saii.testerhome.views.TintableImageView
android:id="@+id/id_job_img"
android:layout_width="30dp"
android:layout_height="30dp"
android:padding="3dp"
android:src="@drawable/tab_main_job"
app:tint="@color/tab_item_tint_color"/>
<TextView
android:id="@+id/id_job_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
android:text="@string/job"
android:textSize="15sp"
android:textColor="#848484"/>
</LinearLayout>
<LinearLayout
android:id="@+id/id_my"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="center"
android:padding="2dp"
>
<com.saii.testerhome.views.TintableImageView
android:id="@+id/id_my_img"
android:layout_width="30dp"
android:layout_height="30dp"
android:padding="3dp"
android:src="@drawable/tab_main_my"
app:tint="@color/tab_item_tint_color"/>
<TextView
android:id="@+id/id_my_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
android:text="@string/my"
android:textSize="12sp"
android:textColor="#848484"/>
</LinearLayout>
</LinearLayout>
底部的布局實際上不太難,就是4個linearylayout實作的。
再來就是綁定linearyLayout的點選事件,并且在點選的時候,顯示對應的fragment.代碼如下:
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fm.beginTransaction();
hideAllFragment(fragmentTransaction);
switch (index){
case Config.COMMUNITYFRAGMENT:
communityImage.setSelected(true);
communityTextView.setTextColor(getResources().getColor(R.color.tab_item_tint_focused));
if (communityFragment==null){
communityFragment = new CommunityFragment();
fragmentTransaction.add(R.id.id_content,communityFragment);
}
fragmentTransaction.show(communityFragment);
break;
case Config.TOPICFRAGMENT:
topicImage.setSelected(true);
topicTextView.setTextColor(getResources().getColor(R.color.tab_item_tint_focused));
if (topicFragment==null){
topicFragment = new TopicFragment();
fragmentTransaction.add(R.id.id_content,topicFragment);
}
fragmentTransaction.show(topicFragment);
break;
case Config.JOBFRAGMENT:
jobImage.setSelected(true);
jobTextView.setTextColor(getResources().getColor(R.color.tab_item_tint_focused));
if (jobFragment==null){
jobFragment = new JobFragment();
fragmentTransaction.add(R.id.id_content,jobFragment);
}
fragmentTransaction.show(jobFragment);
break;
case Config.MYFRAGMENT:
myImage.setSelected(true);
myTextView.setTextColor(getResources().getColor(R.color.tab_item_tint_focused));
if (myFragment==null){
myFragment = new MyFragment();
fragmentTransaction.add(R.id.id_content,myFragment);
}
fragmentTransaction.show(myFragment);
break;
}
fragmentTransaction.commit();
通過fragment管理器擷取到fragment的事務,接着就是判斷每個fragment是否為null如果為空則執行個體化出來,加入到事務中并且讓其顯示出來。
這樣子我們就完成了底部按鈕與Fragment的關聯了,下來的話我們需要實作頂部的最新,最熱按鈕,并且還需要它關聯viewpager 進行手勢滑動。
這裡我們采用了第三方的一個開源庫ViewPagerIndicator使用它友善了很多的工作。
首先還是一樣 我們先将主要的布局準備好。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<com.viewpagerindicator.TabPageIndicator
android:id="@+id/id_indicator"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<android.support.v4.view.ViewPager
android:id="@+id/id_viewpager"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
/>
</LinearLayout>
這裡隻需要聲明一個TabPagerIndicator以及一個viewpager就可以了。
下來就是在我們聲明的一個fragment中實作indicator與viewpager的綁定等等了。
因為Viewpager都需要一個擴充卡 是以我們這裡先申明一個擴充卡
class TabPageIndicatorAdapter extends FragmentPagerAdapter{
public TabPageIndicatorAdapter(FragmentManager fm){
super(fm);
}
//這裡面的bundle隻是為了測試 是以傳遞了按鈕的名稱進去
@Override
public Fragment getItem(int position) {
Fragment fragment = new CommunityItemFragment();
Bundle bundle = new Bundle();
bundle.putString("key",TITLE[position]);
fragment.setArguments(bundle);
return fragment;
}
//傳回每個按鈕的名稱
@Override
public CharSequence getPageTitle(int position) {
return TITLE[position%TITLE.length];
}
@Override
public int getCount() {
return TITLE.length;
}
}
再來就是綁定viewpager 以及adpter還有就是indicator與viewpager的綁定
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_community,container,false);
viewPager = (ViewPager)view.findViewById(R.id.id_viewpager);
tabPageIndicatorAdapter = new TabPageIndicatorAdapter(getFragmentManager());
viewPager.setAdapter(tabPageIndicatorAdapter);
tabPageIndicator = (TabPageIndicator)view.findViewById(R.id.id_indicator);
tabPageIndicator.setViewPager(viewPager);
tabPageIndicator.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
// Toast.makeText(getActivity(), TITLE[position], Toast.LENGTH_SHORT).show();
}
@Override
public void onPageSelected(int position) {
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
return view;
}
最後還需要加上style.xml
<style name="StyledIndicators" parent="@android:style/Theme.Light">
<item name="vpiTabPageIndicatorStyle">@style/CustomTabPageIndicator</item>
</style>
<style name="CustomTabPageIndicator" parent="Widget.TabPageIndicator">
<item name="android:background">@drawable/tab_indicator</item>
<item name="android:textAppearance">@style/CustomTabPageIndicator.Text</item>
<item name="android:textSize">sp</item>
<item name="android:dividerPadding">dp</item>
<item name="android:showDividers">middle</item>
<item name="android:paddingLeft">dp</item>
<item name="android:paddingRight">dp</item>
<item name="android:fadingEdge">horizontal</item>
<item name="android:fadingEdgeLength">dp</item>
</style>
<style name="CustomTabPageIndicator.Text" parent="android:TextAppearance.Medium">
<item name="android:typeface">monospace</item>
</style>
在androidManifest.xml中設定對應的主題就ok了。
最終的效果如下