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的基础知识和滑动 ...
随机推荐
- Java - Thinking in Java 第2章 一切都是对象
Java是"纯粹"的面向对象的语言. 操作的标示符是对象的一个引用, new是创建一个对象. 存储位置: 寄存器\堆栈(引用)\堆(new)\常量存储(程序代码内部)\非RAM存储 ...
- pyspark.mllib.feature module
Feature Extraction Feature Extraction converts vague features in the raw data into concrete numbers ...
- jzoj1495 宝石 解题报告[扫描线]
Description 见上帝动了恻隐之心,天后也想显示一下慈悲之怀,随即从口袋中取出一块魔术方巾,让身边的美神维纳斯拿到后堂的屏风上去试试,屏风是正方形的,高和宽方向上各划有m条鱼屏风的边平行的直线 ...
- POJ 3669 简单BFS
标号 搜 完了-- //By SiriusRen #include <queue> #include <cstdio> #include <cstring> #in ...
- Gson解析List的一点小问题
这阵子在使用gson解析时遇到了点小麻烦,因为一直用的fastjson,最近一个项目里使用的gson,需要解析list集合,查资料都是使用TypeToken解决,相对比较麻烦,下面为大伙推荐一种简便的 ...
- asp.net网页播放MP4 出错
通过IIS进行添加:单击[开始]→[程序]→[管理工具]→[IIS管 理器],逐步展开“本地计算机”.“网站”,在你的网站上右击,选择[属性],单击“HTTP头”选项卡→单击“MIME类型”按钮,再单 ...
- 逻辑学总结x
逻辑学是研究事实联系: 肯定.否定: 条件 结论: 联系 规则: 的学问.
- javascript--记忆函数
function memory(val) { if(!memory.cached) {//判断是否创建了缓存 memory.cached = {}; } if(memory.cached[val] ! ...
- Unity C# 关于设计模式的思考
一.当你的项目发现有如下问题之一时,就需要考虑重构代码,可能会有某种模式适合. 1.代码无法进行单元测试. 2.需求的变动总是导致代码的变动. 3.有重复代码的存在. 4.继承层次过多. 5.隐藏的依 ...
- 数据迁移工具kettle简单上手
近期做了不少数据迁移工作,无一例外都是kettle做的,对于这些工具,我认为.够用就好,不用做特别多的研究(当然.除非你是这款工具的忠实粉丝,我相信这种没几个).kettle也不例外.在我看来就是不同 ...