我們可以發現,在一些新聞客戶端的標題欄中,它們會有很多標題,而這些標題都是可以滑動的,這種效果的實現使用
的就是HorizontalScrollView,我們通過向HorizontalScrollView包含的LinearLayout中動態添加標題,這樣無論我們添加
多少標題,它都是可以滑動的。
activity_main.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<!-- android:scrollbars="none"去除滾動條 -->
<HorizontalScrollView
android:id="@+id/horizontalScrollView_main"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scrollbars="none" >
<LinearLayout
android:id="@+id/layout_container"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="horizontal" >
</LinearLayout>
</HorizontalScrollView>
<TextView
android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#0373b4" />
<android.support.v4.view.ViewPager
android:id="@+id/viewPager_main"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
數組資源:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="arrTabTitles">
<item>要聞</item>
<item>視頻</item>
<item>娛樂</item>
<item>體育</item>
<item>財經</item>
<item>科技</item>
<item>社會</item>
<item>軍事</item>
<item>遊戲</item>
</string-array>
</resources>
選擇器selector:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/bg_tab" android:state_enabled="false"/>
<item android:drawable="@android:color/white" android:state_enabled="true"/>
<!--
android:state_pressed=""
android:state_enabled=""
android:state_checked=""
android:state_activated=""這個屬性常常用於ListView的item的背景設置中。如果使用這個屬性,那麼ListView要設置選擇模式
listView.setChoiceMode();
-->
</selector>
MainActivity:
package com.steven.fragmentviewpagerscrollview;
import java.util.ArrayList;
import java.util.List;
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.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.TextView;
public class MainActivity extends FragmentActivity {
private ViewPager viewPager_main;
private HorizontalScrollView horizontalScrollView_main;
private LinearLayout layout_container;
private String[] arrTitleNames = null;
private TextView[] arrTextView = null;
private List<Fragment> totalList = new ArrayList<Fragment>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化書籤選項卡
initTabs();
// 初始化ViewPager
initViewPager();
}
/**
* 初始化標籤
*/
private void initTabs() {
//獲取HorizontalScrollView的id
horizontalScrollView_main = (HorizontalScrollView) findViewById(R.id.horizontalScrollView_main);
//獲取LinearLayout的id
layout_container = (LinearLayout) findViewById(R.id.layout_container);
//獲取定義的數組資源文件
arrTitleNames = getResources().getStringArray(R.array.arrTabTitles);
//通過定義的數組資源文件給TextView數組初始化長度
arrTextView = new TextView[arrTitleNames.length];
for (int i = 0; i < arrTextView.length; i++) {
// 創建TextView對象
TextView textView = new TextView(this);
// 把資源數組中的數據設置給TextView顯示
textView.setText(arrTitleNames[i]);
// 設置TextView的寬度和高度,都是包裹內容
LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT);
// 把寬度和高度設置給TextView
textView.setLayoutParams(params);
// 設置TextView的位置
textView.setGravity(Gravity.CENTER);
// 設置TextView的內邊距
textView.setPadding(10, 10, 10, 10);
// 給TextView設置選擇器,實現TextView在選中和未選中時顯示不同的圖片資源
textView.setBackgroundResource(R.drawable.bg_textview);
// 讓所有的書籤都能被點擊
textView.setEnabled(true);
// 設置字體大小
textView.setTextSize(16);
// 設置字體顏色
textView.setTextColor(Color.BLACK);
// 把TextView添加到LinearLayout容器中
layout_container.addView(textView);
// 把創建的TextView賦值給TextView數組並設置一個tag
arrTextView[i] = textView;
// 利用給控件增加標籤,方便攜帶數據並添加點擊事件然後切換對應的ViewPager
textView.setTag(i);
// 設置每一個TextView的點擊事件
textView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 通過上面的tag設置ViewPager的改變
int position = (Integer) v.getTag();
viewPager_main.setCurrentItem(position);
}
});
}
// 讓第一個書籤不能被點擊
arrTextView[0].setEnabled(false);
// 設置第一個標籤的顏色爲紅色
arrTextView[0].setTextColor(Color.RED);
}
/**
* 初始化ViewPager
*/
private void initViewPager() {
viewPager_main = (ViewPager) findViewById(R.id.viewPager_main);
for (int i = 0; i < arrTextView.length; i++) {
DummyFragment fragment = DummyFragment.getInstance(i + 1);
totalList.add(fragment);
}
// 給ViewPager設置適配器
viewPager_main.setAdapter(new MyPagerAdapter(
getSupportFragmentManager(), totalList));
// 給ViewPager設置監聽事件
viewPager_main.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int position) {
// 設置每個TextView的屬性和horizontalScrollView的滾動長度
selectCurrenTab(position);
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
}
@Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub
}
});
}
/**
* 設置ViewPager改變時每個TextView的屬性和HorizontalScrollView的偏移量
*
* @param position
*/
private void selectCurrenTab(int position) {
// 先把所有的TextView的背景顏色都設置成黑色,並設置爲可點擊
for (int i = 0; i < arrTitleNames.length; i++) {
arrTextView[i].setTextColor(Color.BLACK);
arrTextView[i].setEnabled(true);
}
// 設置當前position的TextView背景爲紅色,不可點擊
arrTextView[position].setTextColor(Color.RED);
arrTextView[position].setEnabled(false);
/**
* 下面這些東西一時還沒有搞懂,還需要進一步的理解
*/
// 計算屏幕的寬度
int screenWidth = getResources().getDisplayMetrics().widthPixels;
// 計算當前控件距離父容器的左側的距離
int leftSpace = arrTextView[position].getLeft();
// 計算水平滾動視圖應該偏移的數值
int offset = leftSpace
- (screenWidth - arrTextView[position].getWidth()) / 2;
// 讓水平滾動視圖按照偏移量進行移動
horizontalScrollView_main.smoothScrollTo(offset, 0);
}
/**
* 創建ViewPager的適配器
*
* @author Administrator
*
*/
class MyPagerAdapter extends FragmentPagerAdapter {
private List<Fragment> list = null;
public MyPagerAdapter(FragmentManager fm, List<Fragment> list) {
super(fm);
this.list = list;
}
@Override
public Fragment getItem(int position) {
return list.get(position);
}
@Override
public int getCount() {
return list.size();
}
}
}
繼承於ListFragment的MyFragment:
package com.steven.fragmentviewpagerscrollview;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;
@SuppressLint("NewApi")
public class DummyFragment extends ListFragment {
private final static String KEY_NAME = "tabindex";
private int tabindex = 0;
private List<Map<String, Object>> totalList = new ArrayList<Map<String, Object>>();
/**
* 該靜態方法用於在MainActivity中調用
*
* @param tabindex
* @return
*/
public static DummyFragment getInstance(int tabindex) {
DummyFragment fragment = new DummyFragment();
Bundle bundle = new Bundle();
bundle.putInt(KEY_NAME, tabindex);
fragment.setArguments(bundle);
return fragment;
}
/**
* 給List集合設置數據
*/
private void loadNetworkData() {
tabindex = getArguments().getInt(KEY_NAME);
for (int i = 0; i < 20; i++) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("iconId", R.drawable.ic_180);
map.put("title", "title_" + tabindex + "_" + i);
map.put("summary", "summay_" + tabindex + "_" + i);
totalList.add(map);
}
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// 數據初始化。一般來說數據都來自於網絡,需要異步訪問,json解析
loadNetworkData();
// 創建適配器
SimpleAdapter adapter = new SimpleAdapter(getActivity(), totalList,
R.layout.item_dummyframent, new String[] { "iconId", "title",
"summary" }, new int[] { R.id.imageView_item_icon,
R.id.textView_item_title, R.id.textView_item_summary });
// 設置適配器
setListAdapter(adapter);
}
}
運行結果:
下面是藍色的下劃線,是一個9片圖: