Android捕获View焦点事件,LinearLayout结合HorizontalScrollView实现ViewPgaer和选项卡Tabs联动
《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联动的更多相关文章
- Android中View的事件分发机制——Android开发艺术探索笔记
原文链接 http://sparkyuan.me/ 转载请注明出处 介绍 点击事件的事件分发就是对MotionEvent事件的分发过程.当一个MotionEvent产生了以后,系统须要把这个事件传递给 ...
- Android中View的事件分发机制
简介 事件也称MotionEvent,事件分发机制就是对MotionEvent事件的分发过程,即当一个MotionEvent发生之后,系统需要把这个事件传递给一个具体的View. 点击事件的分发过程由 ...
- Delphi XE5 android 捕获几个事件
以下代码能监控到以下几个事件: FinishedLaunching BecameActive WillBecomeInactive EnteredBackground Wi ...
- Android中view的事件
view:top.left.right.bottom,相对于parent的位置参数,获取通过get*()来获取.width=right-left.height=bottom-top.x=left+tr ...
- Win32-API: 终于能正常的捕获焦点事件: WM_COMMAND、BN_SETFOCUS、EN_SETFOCUS
学习和使用win32-api来写窗口程序算算也有二三年了. 以前有个需求,想捕获控件的焦点事件(SETFOCUS. KILLFOCUS),我一直认为应该捕获 WM_SETFOCUS 和 WM_KILL ...
- Android View的事件分发机制和滑动冲突解决方案
这篇文章会先讲Android中View的事件分发机制,然后再介绍Android滑动冲突的形成原因并给出解决方案.因水平有限,讲的不会太过深入,只希望各位看了之后对事件分发机制的流程有个大概的概念,并且 ...
- Android中Touch事件分析--解决HorizontalScrollView滑动和按钮事件触发问题
之前写过关于HorizontalScrollView滑动和按钮事件触发问题,但是不能所有的情况,最近几天一直在想这个问题,今天有一个比较好的解决思路,最终应用在项目里面效果也很好,首先说明一下功能: ...
- Android View 的事件体系
android 系统虽然提供了很多基本的控件,如Button.TextView等,但是很多时候系统提供的view不能满足我们的需求,此时就需要我们根据自己的需求进行自定义控件.这些控件都是继承自Vie ...
- Android艺术开发探索第三章————View的事件体系(下)
Android艺术开发探索第三章----View的事件体系(下) 在这里就能学习到很多,主要还是对View的事件分发做一个体系的了解 一.View的事件分发 上篇大致的说了一下View的基础知识和滑动 ...
随机推荐
- 【金阳光測试】大话Android自己主动化測试--Android自己主动化系列(1)--金阳光于2013年4月份
Android自己主动化測试框架和工具在四年多的发展日趋成熟. 从五年前的第一代自己主动化架构演进到眼下第四代(本系列讲座第7篇后将具体剖析第三代和第四代自己主动化框架)从曾经最早谷歌推崇的monke ...
- ubuntu 非长期支持版升级系统版本号(ssh登录情况适用)
(1)当前系统为非长期支持版.而且已被废弃,仅仅能逐版本号升级 以当前系统版本号为11.10为例 改动source.list更新源为通用old源,由于原来的源已经不可用 deb http://old- ...
- node06---npm、silly-datetime、路径问题
我们刚才学习了,模块就是一些功能的封装,所以一些成熟的.经常使用的功能,都有人封装成为了模块.并且放到了社区中,供人免费下载. 这个伟大的社区,叫做npm. 也是一个工具名字 node package ...
- java9新特性-11-String存储结构变更
1. 官方Feature JEP254: Compact Strings 2. 产生背景 Motivation The current implementation of the String cla ...
- Java类和对象4
编写Java应用程序.首先,定义一个Print类,它有一个方法void output(intx),如果x的值是1,在控制台打印出大写的英文字母表:如果x的值是2,在控制台打印出小写的英文字母表.其次, ...
- spinlock参考资料
spinlock:http://irl.cs.ucla.edu/~yingdi/web/paperreading/smp_locking.pdf
- 51Nod 1007 正整数分组(01背包)
将一堆正整数分为2组,要求2组的和相差最小. 例如:1 2 3 4 5,将1 2 4分为1组,3 5分为1组,两组和相差1,是所有方案中相差最少的. Input 第1行:一个数N,N为正整数的数量. ...
- 维生素C主要生理功能
维C是:维生素C又叫抗坏血酸,是一种水溶性维生素. 维生素C主要生理功能 1. 促进骨胶原的生物合成.利于组织创伤口的更快愈合: 维生素C在体内参与多种反应,如参与氧化还原过程,在生物氧化和还原作用以 ...
- 关于git及其github的使用
一:序言(就是瞎扯) 人们都说不会使用git和github的程序员都不是好程序员,是的,当我第一次听到的时候有点失望.因为我也不会...但是这句话激起了我学习使用git的动力(其实也没怎么深入的学习) ...
- MyBatis学习总结(17)——Mybatis分页插件PageHelper
如果你也在用Mybatis,建议尝试该分页插件,这一定是最方便使用的分页插件. 分页插件支持任何复杂的单表.多表分页,部分特殊情况请看重要提示. 想要使用分页插件?请看如何使用分页插件. 物理分页 该 ...