如何获取fragment的view里的视图

android教程_如何在Fragment中使用ViewPager,并实现导航随手势滑动效果用法,参考,示例_API之家,最大的中文API社区
当前位置:>API参考大全>>如何在Fragment中使用ViewPager,并实现导航随手势滑动效果
如何在Fragment中使用ViewPager,并实现导航随手势滑动效果(,)
出处:csdn
作者:csdn 阅读:17次
看了之前自己的一篇文章,感觉写的不够好,今天推荐一个更好的实现ViewPager导航,比以前的那个帅多了,而且简单多了!可惜CSDN没有删除博客的权限,否则就删除了。以前的文章:http://blog.csdn.net/u/article/details/
今天主要介绍的是:在Fragment中使用ViewPager,ViewPager的内容依然是多个Fragment。本文参考了:/articles/E7n6vu &不过原文中的方法对于我的实际情况还是有点不合适的,出了点问题,下面再说。
要实现View的滑动效果,就必须不断的改变他的位置,可以通过setLayoutParams,也可以通过scrollTo或者scrollBy,或者重写控件等,这里我使用的是更简单的setX(float x),就是改变View的X的坐标位置就OK了,十分的方便。
看一下最主要的代码:
mPageVp.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
public void onPageSelected(int position) {
currentIndex =
public void onPageScrolled(int position, float offset,
int offsetPixels) {
if(currentIndex&position&&(currentIndex-position)==1)
int xOffset = (int) (-(1 - offset)
* (screenWidth * 1.0 /pageNum) + currentIndex
* (screenWidth /pageNum));
rlOverlay.setX(xOffset);
}else if(currentIndex==position)
int xOffset = (int) (offset * (screenWidth * 1.0 /pageNum) + currentIndex
* (screenWidth /pageNum));
rlOverlay.setX(xOffset);
public void onPageScrollStateChanged(int state) {
//在这里来改变被选中的item的高亮样式
可以看到上面根据currentIndex以及position的变化,不断的计算View的X对应要滑动到的位置,currentIndex是当前选中的item索引,position是ViewPager滑动时显示的视图的索引。
看一下效果图:
现在来说一下如果通过setLayoutParams会出现什么问题,如果是通过这种方式,那么当你切换到这个Fragment时,初始化的时候即使你通过setCurrentItem(2)来设置默认显示第三个子fragment,导航栏中的蓝色背景依然停留在第一个导航处,到那时下面的内容显示是第三个。另外你第一次通过手指切换内容视图的时候,上面的蓝色背景不会随着手指一动,只有页面切换完成,他才会移动,就是在ViewPager滚动过程中,setLayoutParams没有起作用,虽然执行了,但是没有效果,后面再滑动的时候就会随着手指移动了。
上面代码中判断语句:if(currentIndex&position&&(currentIndex-position)==1)
之所以这样写,是因为如果不添加currentIndex-position==1的判断,从第一个滑到第三个或者第四个,背景图片会出现颤抖的情况,其实这种效果也很不错,要是喜欢,可以把这个&&后面的去掉。
其实写这么多我知道也没人看,下面是源码地址:
上一篇:下一篇:
ViewPager相关文章请点击
责任申明:本站内容均整理自互联网,若有侵权,请联系我们。使用本站提供的任务技术内容造成不良后果,本站不负任何责任。
欢迎投稿,电子邮件:(#号换成@)&& QQ群1: &&下次自动登录
现在的位置:
& 综合 & 正文
android fragment 切换时上下层视图点击区域冲突
在使用fragment 动态add
或者replace fragment 后碰到过点击空白区域响应
add 或者replace 之前的 UI 或者fragment里的点击事件 ,导致异常操作!
在android-support-v4 中FragmentPagerAdapter 一段
public Object instantiateItem(ViewGroup container, int position) {
if (mCurTransaction == null) {
mCurTransaction = mFragmentManager.beginTransaction();
final long itemId = getItemId(position);
// Do we already have this fragment?
String name = makeFragmentName(container.getId(), itemId);
Fragment fragment = mFragmentManager.findFragmentByTag(name);
if (fragment != null) {
if (DEBUG) Log.v(TAG, "Attaching item #" + itemId + ": f=" + fragment);
mCurTransaction.attach(fragment);
fragment = getItem(position);
if (DEBUG) Log.v(TAG, "Adding item #" + itemId + ": f=" + fragment);
mCurTransaction.add(container.getId(), fragment,
makeFragmentName(container.getId(), itemId));
if (fragment != mCurrentPrimaryItem) {
FragmentCompat.setMenuVisibility(fragment, false);
FragmentCompat.setUserVisibleHint(fragment, false);
public void setPrimaryItem(ViewGroup container, int position, Object object) {
Fragment fragment = (Fragment)
if (fragment != mCurrentPrimaryItem) {
if (mCurrentPrimaryItem != null) {
FragmentCompat.setMenuVisibility(mCurrentPrimaryItem, false);
FragmentCompat.setUserVisibleHint(mCurrentPrimaryItem, false);
if (fragment != null) {
FragmentCompat.setMenuVisibility(fragment, true);
FragmentCompat.setUserVisibleHint(fragment, true);
mCurrentPrimaryItem =
instantiateItem 和setPrimaryItem 方法里面是通过FragmentCompat 方法来控制fragment的显示和隐藏
其实就是使用Fragment 的方法setUserVisibleHint 和setMenuVisibility 方法来控制fragment的显示和隐藏
但 在fragment里面replace或者add fragment
之前使用setUserVisibleHint 和setMenuVisibility 方法并没有起到理想的效果!
可能是我没有正确使用 setUserVisibleHint 和setMenuVisibility 方法吧!
FragmentPagerAdapter 管理fragment 在viewpager 里面切换没有点击区域和fragment重叠的问题!
但是将fragment直接detach掉 每切换一次就要new一个fragment 不符合项目需求!
没办法只能在顶层的fragment 上接收onclick 点击事件
在oncreateview里面
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
view.setOnclickListener(null);
view 返回之前加上全局视图点击监听,防止点击事件被之前的fragment或者activity视图处理产生异常操作!
暂时只能这样!内位高手有什么好的解决方法指导下呵呵!
&&&&推荐文章:
【上篇】【下篇】原文地址:b.com/kross/p/3328389.html
折腾了两天,感觉有点会用了,Fragment给我的感觉就是网页上的AJAX,个人感觉,个人感觉O(&_&)O。
Fragment可以当成一块视图,可以动态的添加到当前的视图中,也可以进行替换,或者删除,所以才说感觉很像AJAX。
我做的一个demo就是google上的那个,显示一个列表,然后点击,页面就变成详细页,不过我是后按照自己的想法去实现的。下面就说下怎么操作吧。
首先,我们需要一个Activity(activity_main.xml),用来启动的时候显示,但里面并不做任何数据的输出。布局文件如下:
&LinearLayout xmlns:android="/apk/res/android"
xmlns:tools="/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" &
&FrameLayout
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent"&
&/FrameLayout&
&/LinearLayout&
需要注意的:里面有一个FrameLayout,属性里有一个id,这样就足够了。
然后,我们希望程序启动后页面上显示一个列表(ListView),这个时候,需要用Fragment把列表显示出来,替换到FrameLayout上面,下面我们去实现一个显示列表的TitleFragment
扩展Fragment的时候,有许多方法可以去覆写(Override),也可以不覆写,根据在下的学习与理解,我认为onCreateView()这个方法是返回一个视图的,也就是Fragment这个的视图,因此,如果你的Fragment是要去显示的,肯定要覆写这个方法,然后把视图返回出去。
代码如下,一步步来:
TitleFragment extends Fragment {
public View onCreateView( inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.title_fragment, container, false);
&需要注意的是LayoutInflater.inflate()这个方法,很长一段时间,我都木有理解什么叫所谓的&扩充布局&,后来去stackoverflow网站上去找找,老外说:扩充布局这是java里面的一个惯用的说法。实际上就是将一个布局文件(xml)变成一个View对象,在下是这样理解的。Activity中有一个setContentView()的方法,应该也是将布局文件转成一个View对象,然后给Activity设置上。
如上的代码就是要让onCreateView返回一个View对象啦,当然我们这个TitleFragment对象是要显示一个列表的,所以布局中应该有一个ListView的吧,看看布局文件title_fragment.xml
&?xml version="1.0" encoding="utf-8"?&
&LinearLayout xmlns:android="/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" &
android:id="@+id/title_listview"
android:layout_width="match_parent"
android:layout_height="match_parent"/&
&/LinearLayout&
这个布局也是非常的简单的。
我们仅仅是是用inflate()成功获取整个布局是不够的,我们还需要获取的ListView,并且给它设置适配器才算是完成任务。
因为在设置new适配器的时候,第一个参数是Context,所以我们必须获取到TitleFragment所附着的Activity对象,看看回调函数中,一个onAttach(Activity activity)这样的函数,可以获取到context对象,因此我们需要在TitleFragment类中声明一个Context的成员属性,并且在onAttach回调函数中把context保存起来,这样在new适配器的时候才有context可以用。
经过以上的加工,TitleFragment.java的代码如下:
public class TitleFragment extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.title_fragment, container, false);
ListView listView = (ListView)v.findViewById(R.id.title_listview);
List&HashMap&String, String&& list = new ArrayList&HashMap&String, String&&();
for (int i = 0; i & MyData.titleArray. i++) {
HashMap&String, String& temp = new HashMap&String, String&();
temp.put("title", MyData.titleArray[i]);
list.add(temp);
SimpleAdapter sa = new SimpleAdapter(this.context, list, R.layout.item, new String[]{"title"}, new int[]{R.id.title_textview});
listView.setAdapter(sa);
public void onAttach(Activity activity) {
super.onAttach(activity);
this.context = (MainActivity)
OK,这样TitleFragment能正确的返回一个带有listView的视图了,我们接着回到MainActivity中去操作。
操作Fragment必须要有FragmentManager这个对象的,这里有一个坑爹之处。
官方推荐我们使用的是android.support.v4.app这个包下的Fragment,而不是android.app这个包下的Fragment,因此我们需要用getSupportFragmentManager()去获取android.support.v4.app.FragmentManager。
因此MainActivity需要继承的是FragmentActivity
接下来的操作就比较简单了,获取FragmentManager,事务,替换,提交即可,代码如下:
public class MainActivity extends FragmentActivity {
private FragmentManager fragmentM
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.fragmentManager = getSupportFragmentManager();
FragmentTransaction ft = this.fragmentManager.beginTransaction();
TitleFragment titleFragment = new TitleFragment();
ft.replace(R.id.pager, titleFragment);
ft.commit();
OKOK,到目前为止,该程序启动后,会显示出一个列表,木有任何问题,接下来我们要做的,就是点击列表中的一项,可以将整个FrameLayout给换掉,换成详细的页面。那么在ListView那里必须给设置一个器,代码如下:
public class TitleFragment extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.title_fragment, container, false);
ListView listView = (ListView)v.findViewById(R.id.title_listview);
List&HashMap&String, String&& list = new ArrayList&HashMap&String, String&&();
for (int i = 0; i & MyData.titleArray. i++) {
HashMap&String, String& temp = new HashMap&String, String&();
temp.put("title", MyData.titleArray[i]);
list.add(temp);
     //设置监听器!!!!
listView.setOnItemClickListener(new ItemClickListener());
SimpleAdapter sa = new SimpleAdapter(this.context, list, R.layout.item, new String[]{"title"}, new int[]{R.id.title_textview});
listView.setAdapter(sa);
public void onAttach(Activity activity) {
super.onAttach(activity);
this.context = (MainActivity)
  //监听器!!!
class ItemClickListener implements OnItemClickListener {
public void onItemClick(AdapterView&?& arg0, View arg1, int arg2,
long arg3) {        //这里调用的是Activity里面的方法!!!
((MainActivity)TitleFragment.this.context).showDetail(arg2);
因为使用FragmentManager的能力,只有Activity才具备,因此得把替换的方法写在MainActivity里面。MainActivity的代码变成如下的样子
public class MainActivity extends FragmentActivity {
private FragmentManager fragmentM
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.fragmentManager = getSupportFragmentManager();
FragmentTransaction ft = this.fragmentManager.beginTransaction();
TitleFragment titleFragment = new TitleFragment();
ft.replace(R.id.pager, titleFragment);
ft.commit();
}public void showDetail(int index) {     //需要注意的是FragmentTransaction对象commit之后就不能继续使用了,需要重新new一个
FragmentTransaction ft = this.fragmentManager.beginTransaction();
DetailFragment detailFragment = new DetailFragment();
Bundle b = new Bundle();
b.putInt("index", index);     //给detailFragment设置一个参数,这样详细页才能知道自己显示哪一个文章,类似于get请求detail.php?id=112
detailFragment.setArguments(b);
ft.replace(R.id.pager, detailFragment);     //下面这句的作用很大,这句话将该事务加入了回退栈里面,也就是当你显示详细页后,你按后退的按钮,可以回到列表页,如果没有这样做,按后退直接退出了~
ft.addToBackStack("title");
ft.commit();
注意的要点都在代码的,大家看看就懂了,接下来贴下DetailFragment的代码
public class DetailFragment extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.detail, container, false);
TextView textView = (TextView)v.findViewById(R.id.content);     //这里获取到刚刚设置的参数~
Bundle b = this.getArguments();
int index = b.getInt("index");
textView.setText(MyData.articleArray[index]);
OKOK,代码基本上贴完了,以上就是在下这两天的学习成果,理解了不少东西,真是很开心,肯定也有些理解不到位的,希望有大神能给与一些指点。哈哈
原文地址:/kross/p/3328389.html
新浪微博:/u/

我要回帖

更多关于 获取fragment的view 的文章

 

随机推荐