《Android捕获View焦点事件,LinearLayout结合HorizontalScrollView实现ViewPgaer和选项卡Tabs联动。》

如图:

package zhangphil.tabs;

import java.util.ArrayList;

import android.support.v4.app.Fragment;
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.support.v7.app.ActionBarActivity;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnFocusChangeListener;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.graphics.Color;
import android.os.Bundle; /**
*
* Android捕获View焦点事件,LinearLayout结合HorizontalScrollView实现ViewPgaer和选项卡Tabs联动。 *
* 思路:实现方案非常多。本例是把一个水平的LinearLayout在外层用HorizontalScrollView包裹起来(之所以使用HorizontalScrollView再包裹一层,是考虑到选项卡条目可能非常多的情况下,让用户能够像ListView一样滑动选择。否则,单纯的使用LinearLayout加入有限条目超过边界后多的元素不可见)。然后在LinearLayout里面加入若干子元素(简单期间,就比方TextView),做成一个横向可滑动且响应触发点击事件的"ListView"。该“ListView”响应点击事件,触发ViewPager页面的切换。 * 实现目的:tab栏中的选项和ViewPager中的Fragment实时联动。比方。当ViewPager滑动到第10的位置时候,对应的位于顶部(或者底部)的tab也要切换到第十的位置。反之亦然。
* 这样的控件效果使用极为广泛。尤其是在一些新闻client中常见,比方新浪新闻、腾讯新闻新闻client的头部标签导航选项卡。
*
*
* 附參考文章: 怎样让一个View的焦点改变时同一时候改变其附属元素。可參考我的还有一篇文章:
* 《Android实现连续并排的若干个TextView单击改变背景颜色达到选项卡Tab栏切换效果 》
* 链接地址:http://blog.csdn.net/zhangphil/article/details/46547561
*
*
* */ public class MainActivity extends ActionBarActivity { private ArrayList<Fragment> fragments; // 測试的Fragment数量,也即是选项卡片的数量。 private final int SIZE = 15; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); fragments = new ArrayList<Fragment>();
for (int i = 0; i < SIZE; i++) {
Fragment f = TestFragment.newInstance(i);
fragments.add(f);
} // 将在tabs_LinearLayout里面加入须要的若干选项卡片。
final LinearLayout tabs_LinearLayout = (LinearLayout) findViewById(R.id.tabs_LinearLayout); final ViewPager mViewPager = (ViewPager) findViewById(R.id.viewpager); for (int i = 0; i < SIZE; i++) {
View v = LayoutInflater.from(this).inflate(R.layout.view, null);
TextView tv = (TextView) v;
tv.setText("tab" + i); v.setOnFocusChangeListener(new OnFocusChangeListener() { @Override
public void onFocusChange(View v, boolean hasFocus) { // 当用户选择了tab选项卡上面的子元素时候,对应的把ViewPager显示的页面调整到对应位置。 int count = tabs_LinearLayout.getChildCount();
for (int i = 0; i < count; i++) {
View cv = tabs_LinearLayout.getChildAt(i);
if (v == cv) {
if (hasFocus) {
mViewPager.setCurrentItem(i);
break;
}
}
}
}
}); tabs_LinearLayout.addView(v, i);
} mViewPager.setAdapter(new MyFragmentPagerAdapter(this
.getSupportFragmentManager()));
mViewPager.setOnPageChangeListener(new OnPageChangeListener() { @Override
public void onPageScrollStateChanged(int arg0) { } @Override
public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override
public void onPageSelected(int pos) {
// 在这里,当用户翻动ViewPager页面时候,对应的把选项卡显示对应的位置。
// 最轻巧的实现就是让tab选项卡栏中的子元素获得焦点就可以。
View v = tabs_LinearLayout.getChildAt(pos);
v.requestFocus();
}
});
} // ViewPager的适配器。
private class MyFragmentPagerAdapter extends FragmentPagerAdapter { public MyFragmentPagerAdapter(FragmentManager fm) {
super(fm);
} @Override
public Fragment getItem(int pos) {
return fragments.get(pos);
} @Override
public int getCount() {
return fragments.size();
}
} // 只用于測试的Fragment。 public static class TestFragment extends Fragment { // 用一个id标明。否则难以识别效果。
private static final String ID = "id"; public static Fragment newInstance(int id) {
Fragment f = new TestFragment();
Bundle b = new Bundle();
b.putInt(ID, id);
f.setArguments(b);
return f;
} @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) { Bundle bundle = this.getArguments();
int id = (Integer) bundle.get(ID); TextView tv = new TextView(this.getActivity());
tv.setGravity(Gravity.CENTER);
tv.setText("Fragment:" + id);
tv.setTextSize(50.0f);
tv.setTextColor(Color.LTGRAY); return tv;
}
}
}

activity_main.xml:

<?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="match_parent"
android:orientation="vertical" > <HorizontalScrollView
android:id="@+id/tabs_HorizontalScrollView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbars="none" > <LinearLayout
android:id="@+id/tabs_LinearLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:layout_weight="1" > </LinearLayout> </HorizontalScrollView> <View
android:layout_width="match_parent"
android:layout_height="5dip"
android:background="@android:color/black" /> <android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="9" /> </LinearLayout>

view.xml:

<?xml version="1.0" encoding="utf-8"?

>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/selector"
android:clickable="true"
android:focusable="true"
android:focusableInTouchMode="true"
android:gravity="center"
android:padding="5dip" > </TextView>

selector.xml:

<?xml version="1.0" encoding="utf-8"?

>
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/red" android:state_focused="true"/>
<item android:drawable="@drawable/orange" android:state_pressed="true"/>
<item android:drawable="@drawable/green"/> </selector>

剩余的是在drawable文件夹下的一些基础的图片资源。能够依据自己须要加入。

Android捕获View焦点事件,LinearLayout结合HorizontalScrollView实现ViewPgaer和选项卡Tabs联动的更多相关文章

  1. Android中View的事件分发机制——Android开发艺术探索笔记

    原文链接 http://sparkyuan.me/ 转载请注明出处 介绍 点击事件的事件分发就是对MotionEvent事件的分发过程.当一个MotionEvent产生了以后,系统须要把这个事件传递给 ...

  2. Android中View的事件分发机制

    简介 事件也称MotionEvent,事件分发机制就是对MotionEvent事件的分发过程,即当一个MotionEvent发生之后,系统需要把这个事件传递给一个具体的View. 点击事件的分发过程由 ...

  3. Delphi XE5 android 捕获几个事件

    以下代码能监控到以下几个事件: FinishedLaunching     BecameActive     WillBecomeInactive    EnteredBackground    Wi ...

  4. Android中view的事件

    view:top.left.right.bottom,相对于parent的位置参数,获取通过get*()来获取.width=right-left.height=bottom-top.x=left+tr ...

  5. Win32-API: 终于能正常的捕获焦点事件: WM_COMMAND、BN_SETFOCUS、EN_SETFOCUS

    学习和使用win32-api来写窗口程序算算也有二三年了. 以前有个需求,想捕获控件的焦点事件(SETFOCUS. KILLFOCUS),我一直认为应该捕获 WM_SETFOCUS 和 WM_KILL ...

  6. Android View的事件分发机制和滑动冲突解决方案

    这篇文章会先讲Android中View的事件分发机制,然后再介绍Android滑动冲突的形成原因并给出解决方案.因水平有限,讲的不会太过深入,只希望各位看了之后对事件分发机制的流程有个大概的概念,并且 ...

  7. Android中Touch事件分析--解决HorizontalScrollView滑动和按钮事件触发问题

    之前写过关于HorizontalScrollView滑动和按钮事件触发问题,但是不能所有的情况,最近几天一直在想这个问题,今天有一个比较好的解决思路,最终应用在项目里面效果也很好,首先说明一下功能: ...

  8. Android View 的事件体系

    android 系统虽然提供了很多基本的控件,如Button.TextView等,但是很多时候系统提供的view不能满足我们的需求,此时就需要我们根据自己的需求进行自定义控件.这些控件都是继承自Vie ...

  9. Android艺术开发探索第三章————View的事件体系(下)

    Android艺术开发探索第三章----View的事件体系(下) 在这里就能学习到很多,主要还是对View的事件分发做一个体系的了解 一.View的事件分发 上篇大致的说了一下View的基础知识和滑动 ...

随机推荐

  1. Mongodb集群之副本集

    上篇咱们遗留了几个问题 1主节点是否能自己主动切换连接? 眼下须要手动切换 2主节点读写压力过大怎样解决 3从节点每一个上面的数据都是对数据库全量拷贝,从节点压力会不会过大 4数据压力达到机器支撑不了 ...

  2. Objects are mutable

    We can change the state of an object by making an assignment to one of its attributes. For example, ...

  3. 空值(NULL)和非空(NOT NULL)(十二)

    不多说,直接上干货! NULL:表示字段可以为空 NOT NULL:表示字段不允许为空 注意:NULL和NOT NULL不可以同时用于一个字段上. create table tb2( username ...

  4. java连接操作Oracle

    package com.sp.test; import java.sql.*; import java.util.*; public class Text_lianxi extends Thread ...

  5. 51Nod 最长的循环节(打表预处理)

    正整数k的倒数1/k,写为10进制的小数如果为无限循环小数,则存在一个循环节,求<=n的数中,倒数循环节长度最长的那个数,假如存在多个最优的答案,输出所有答案中最大的那个数.     1/6= ...

  6. MyEclipse for mac 快捷键

    原文出处:http://blog.csdn.net/ray_seu/article/details/17384463 一直比较欣赏myeclipse的快捷键,网上搜索了一圈,发现windows平台下面 ...

  7. [HAOI2016]找相同字符 广义后缀自动机_统计出现次数

    题目描述:给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两个子串中有一个位置不同. 输入输出格式输入格式:两行,两个字符串 s1,s2,长度分别为n ...

  8. 洛谷1414 又是毕业季II

    问题描述 彩排了一次,老师不太满意.当然啦,取每位同学的号数来找最大公约数显然不太合理.于是老师给每位同学评了一个能力值.于是现在问题变为,从n个学生中挑出k个人使得他们的默契程度(即能力值的最大公约 ...

  9. websocket调试工具

    http://www.blue-zero.com/WebSocket/ wss://yy.xxx.com/video/websocket/client.ws

  10. linux一个网卡添加多个虚IP

    [root@localhost ~]# ifconfig bond0:0 10.0.0.202 netmask 255.255.255.255 broadcast 10.0.0.255 up 摘自:h ...