ViewPager 子页的事件监听

dandan5238 2013-05-20 05:52:37
已经使用ViewPager实现了滑动的效果,但是发现子页原本的事件监听都失效了 需要移到ViewPager页的instantiateItem方法中,但是这样的8 9个页面的方法都在一起很乱。请问如何在使用ViewPager整合后使子页原本的事件监听都还能用。
...全文
16558 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
advancewst 2015-03-27
  • 打赏
  • 举报
回复
您好,借我看一下您的布局文件吧。thankyou。
dandan5238 2013-05-21
  • 打赏
  • 举报
回复
引用 5 楼 kechanghe0705 的回复:
有几种方法啊 1.使用onPageSelected监听 2.把事件先添加好,在instantiateItem里面只获取List<View>的引用,不改变它的事件
您的第2种能给个简单的demo吗?麻烦了...
j_f0001 2013-05-21
  • 打赏
  • 举报
回复
有几种方法啊 1.使用onPageSelected监听 2.把事件先添加好,在instantiateItem里面只获取List<View>的引用,不改变它的事件
dandan5238 2013-05-21
  • 打赏
  • 举报
回复
顶下,有人能帮忙解答下吗
dandan5238 2013-05-21
  • 打赏
  • 举报
回复
找到解决方案了,不能说是完美的办法,但是也算曲线救国, 在viewpager中对事件进行监听,具体实现到别去,这样代码结构会清晰很多 例子 viewpager 中 gobButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub //viewPager.setCurrentItem(1); viewPager.setCurrentItem(2); Third third=new Third(); third.aa(TestViewPager.this); } }); 在其他类或Third activity后台: public void aa(Activity sa) { String a=""; tv=(TextView)sa.findViewById(R.id.tvtt); tv.setText("哈哈搞定"); Toast.makeText(sa, "OK", Toast.LENGTH_SHORT).show(); }
dandan5238 2013-05-21
  • 打赏
  • 举报
回复
引用 8 楼 kechanghe0705 的回复:
[quote=引用 6 楼 dandan5238 的回复:] [quote=引用 5 楼 kechanghe0705 的回复:] 有几种方法啊 1.使用onPageSelected监听 2.把事件先添加好,在instantiateItem里面只获取List<View>的引用,不改变它的事件
您的第2种能给个简单的demo吗?麻烦了...[/quote]
package com.example.androidtest;

import java.util.ArrayList;
import java.util.List;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.database.DataSetObserver;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.PageTransformer;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.animation.AnimationUtils;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView;

@SuppressLint("NewApi")
public class ViewPagerActivity extends Activity{

	private List<String> listData=new ArrayList<String>();

	private List<View> listView=new ArrayList<View>();
	private List<List<String>> listStations=new ArrayList<List<String>>();


	ViewPager viewPager;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_viewpager);

		viewPager=(ViewPager)this.findViewById(R.id.viewPager);

		viewPager.setPageMargin(10);
		viewPager.setPageMarginDrawable(R.drawable.ic_launcher);

		viewPager.setPageTransformer(true, new ZoomOutPageTransformer());	

		this.findViewById(R.id.button1).setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				initData();
			}
		});


	}

	@SuppressLint("NewApi")
	public class ZoomOutPageTransformer implements ViewPager.PageTransformer {     
		private static final float MIN_SCALE = 0.85f;     
		private static final float MIN_ALPHA = 0.5f;     
		@SuppressLint("NewApi")
		public void transformPage(View view, float position) 
		{        
			int pageWidth = view.getWidth();        
			int pageHeight = view.getHeight();   
			Log.d("dd",view.getTag()+"  pageWidth:"+pageWidth+"  pageHeight:"+pageHeight+" position:"+position);
			if (position < -1) { // [-Infinity,-1)             // This page is way off-screen to the left.             
				view.setAlpha(0);         
			} else if (position <= 1) { // [-1,1]             // Modify the default slide transition to shrink the page as well             
				float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position));            
				float vertMargin = pageHeight * (1 - scaleFactor) / 2;             
				float horzMargin = pageWidth * (1 - scaleFactor) / 2;            
				if (position < 0) {                
					view.setTranslationX(horzMargin - vertMargin / 2);           
				} 
				else {                
					view.setTranslationX(-horzMargin + vertMargin / 2);            
				}              // Scale the page down (between MIN_SCALE and 1)             
				view.setScaleX(scaleFactor);            
				view.setScaleY(scaleFactor);              // Fade the page relative to its size.             
				view.setAlpha(MIN_ALPHA +(scaleFactor - MIN_SCALE) / (1 - MIN_SCALE) * (1 - MIN_ALPHA));       
			} else { // (1,+Infinity]             // This page is way off-screen to the right.            
				view.setAlpha(0);        
			} 
		}
	}

	private void initData(){
		for(int i=0;i<5;i++){
			View view=LayoutInflater.from(this).inflate(R.layout.activity_viewpager_item, null);
			view.setOnClickListener(new OnClickListener() {
				
				@Override
				public void onClick(View v) {
					// 在这里添加点击事件
					
				}
			});
			view.setTag("索引:"+i);
			listView.add(view);

			List<String> listStation=new ArrayList<String>();
			for(int j=0;j<50;j++){
				listStation.add("站点:"+j);
			}
			listStations.add(listStation);
		}

		viewPager.setAdapter(new PagerAdapter() {

			@Override
			public boolean isViewFromObject(View arg0, Object arg1) {
				return arg0==arg1;
			}

			@Override
			public int getCount() {
				return listView.size();
			}

			@Override
			public Object instantiateItem(ViewGroup container, final int position) {
				View view=listView.get(position);
				ListView lv= (ListView) view.findViewById(R.id.listView1);
				lv.setAdapter(new BaseAdapter() {

					@Override
					public View getView(int p, View convertView, ViewGroup parent) {
						if(convertView==null){
							convertView=LayoutInflater.from(ViewPagerActivity.this).inflate(android.R.layout.simple_list_item_1, null);
						}

						((TextView)convertView.findViewById(android.R.id.text1)).setText(listStations.get(position).get(p));
						return convertView;
					}

					@Override
					public long getItemId(int p) {
						return p;
					}

					@Override
					public Object getItem(int p) {
						// TODO Auto-generated method stub
						return listStations.get(position).get(p);
					}

					@Override
					public int getCount() {
						return listStations.get(position).size();
					}
				});
				container.addView(listView.get(position));

				return listView.get(position);
			}

			@Override
			public void destroyItem(ViewGroup container, int position,
					Object object) {
				container.removeView(listView.get(position));
			}
		});
		viewPager.setCurrentItem(0);
	}

}
[/quote] 很感谢你的demo 这样依旧需要把所有分页的后台写在ViewPager中,看来好像没什么好办法了。
j_f0001 2013-05-21
  • 打赏
  • 举报
回复
引用 6 楼 dandan5238 的回复:
[quote=引用 5 楼 kechanghe0705 的回复:] 有几种方法啊 1.使用onPageSelected监听 2.把事件先添加好,在instantiateItem里面只获取List<View>的引用,不改变它的事件
您的第2种能给个简单的demo吗?麻烦了...[/quote]
package com.example.androidtest;

import java.util.ArrayList;
import java.util.List;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.database.DataSetObserver;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.PageTransformer;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.animation.AnimationUtils;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView;

@SuppressLint("NewApi")
public class ViewPagerActivity extends Activity{

	private List<String> listData=new ArrayList<String>();

	private List<View> listView=new ArrayList<View>();
	private List<List<String>> listStations=new ArrayList<List<String>>();


	ViewPager viewPager;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_viewpager);

		viewPager=(ViewPager)this.findViewById(R.id.viewPager);

		viewPager.setPageMargin(10);
		viewPager.setPageMarginDrawable(R.drawable.ic_launcher);

		viewPager.setPageTransformer(true, new ZoomOutPageTransformer());	

		this.findViewById(R.id.button1).setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				initData();
			}
		});


	}

	@SuppressLint("NewApi")
	public class ZoomOutPageTransformer implements ViewPager.PageTransformer {     
		private static final float MIN_SCALE = 0.85f;     
		private static final float MIN_ALPHA = 0.5f;     
		@SuppressLint("NewApi")
		public void transformPage(View view, float position) 
		{        
			int pageWidth = view.getWidth();        
			int pageHeight = view.getHeight();   
			Log.d("dd",view.getTag()+"  pageWidth:"+pageWidth+"  pageHeight:"+pageHeight+" position:"+position);
			if (position < -1) { // [-Infinity,-1)             // This page is way off-screen to the left.             
				view.setAlpha(0);         
			} else if (position <= 1) { // [-1,1]             // Modify the default slide transition to shrink the page as well             
				float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position));            
				float vertMargin = pageHeight * (1 - scaleFactor) / 2;             
				float horzMargin = pageWidth * (1 - scaleFactor) / 2;            
				if (position < 0) {                
					view.setTranslationX(horzMargin - vertMargin / 2);           
				} 
				else {                
					view.setTranslationX(-horzMargin + vertMargin / 2);            
				}              // Scale the page down (between MIN_SCALE and 1)             
				view.setScaleX(scaleFactor);            
				view.setScaleY(scaleFactor);              // Fade the page relative to its size.             
				view.setAlpha(MIN_ALPHA +(scaleFactor - MIN_SCALE) / (1 - MIN_SCALE) * (1 - MIN_ALPHA));       
			} else { // (1,+Infinity]             // This page is way off-screen to the right.            
				view.setAlpha(0);        
			} 
		}
	}

	private void initData(){
		for(int i=0;i<5;i++){
			View view=LayoutInflater.from(this).inflate(R.layout.activity_viewpager_item, null);
			view.setOnClickListener(new OnClickListener() {
				
				@Override
				public void onClick(View v) {
					// 在这里添加点击事件
					
				}
			});
			view.setTag("索引:"+i);
			listView.add(view);

			List<String> listStation=new ArrayList<String>();
			for(int j=0;j<50;j++){
				listStation.add("站点:"+j);
			}
			listStations.add(listStation);
		}

		viewPager.setAdapter(new PagerAdapter() {

			@Override
			public boolean isViewFromObject(View arg0, Object arg1) {
				return arg0==arg1;
			}

			@Override
			public int getCount() {
				return listView.size();
			}

			@Override
			public Object instantiateItem(ViewGroup container, final int position) {
				View view=listView.get(position);
				ListView lv= (ListView) view.findViewById(R.id.listView1);
				lv.setAdapter(new BaseAdapter() {

					@Override
					public View getView(int p, View convertView, ViewGroup parent) {
						if(convertView==null){
							convertView=LayoutInflater.from(ViewPagerActivity.this).inflate(android.R.layout.simple_list_item_1, null);
						}

						((TextView)convertView.findViewById(android.R.id.text1)).setText(listStations.get(position).get(p));
						return convertView;
					}

					@Override
					public long getItemId(int p) {
						return p;
					}

					@Override
					public Object getItem(int p) {
						// TODO Auto-generated method stub
						return listStations.get(position).get(p);
					}

					@Override
					public int getCount() {
						return listStations.get(position).size();
					}
				});
				container.addView(listView.get(position));

				return listView.get(position);
			}

			@Override
			public void destroyItem(ViewGroup container, int position,
					Object object) {
				container.removeView(listView.get(position));
			}
		});
		viewPager.setCurrentItem(0);
	}

}
j_f0001 2013-05-21
  • 打赏
  • 举报
回复
引用 6 楼 dandan5238 的回复:
[quote=引用 5 楼 kechanghe0705 的回复:] 有几种方法啊 1.使用onPageSelected监听 2.把事件先添加好,在instantiateItem里面只获取List<View>的引用,不改变它的事件
您的第2种能给个简单的demo吗?麻烦了...[/quote]
package com.example.androidtest;

import java.util.ArrayList;
import java.util.List;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.database.DataSetObserver;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.PageTransformer;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.animation.AnimationUtils;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView;

@SuppressLint("NewApi")
public class ViewPagerActivity extends Activity{

	private List<String> listData=new ArrayList<String>();

	private List<View> listView=new ArrayList<View>();
	private List<List<String>> listStations=new ArrayList<List<String>>();


	ViewPager viewPager;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_viewpager);

		viewPager=(ViewPager)this.findViewById(R.id.viewPager);

		viewPager.setPageMargin(10);
		viewPager.setPageMarginDrawable(R.drawable.ic_launcher);

		viewPager.setPageTransformer(true, new ZoomOutPageTransformer());	

		this.findViewById(R.id.button1).setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				initData();
			}
		});


	}

	@SuppressLint("NewApi")
	public class ZoomOutPageTransformer implements ViewPager.PageTransformer {     
		private static final float MIN_SCALE = 0.85f;     
		private static final float MIN_ALPHA = 0.5f;     
		@SuppressLint("NewApi")
		public void transformPage(View view, float position) 
		{        
			int pageWidth = view.getWidth();        
			int pageHeight = view.getHeight();   
			Log.d("dd",view.getTag()+"  pageWidth:"+pageWidth+"  pageHeight:"+pageHeight+" position:"+position);
			if (position < -1) { // [-Infinity,-1)             // This page is way off-screen to the left.             
				view.setAlpha(0);         
			} else if (position <= 1) { // [-1,1]             // Modify the default slide transition to shrink the page as well             
				float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position));            
				float vertMargin = pageHeight * (1 - scaleFactor) / 2;             
				float horzMargin = pageWidth * (1 - scaleFactor) / 2;            
				if (position < 0) {                
					view.setTranslationX(horzMargin - vertMargin / 2);           
				} 
				else {                
					view.setTranslationX(-horzMargin + vertMargin / 2);            
				}              // Scale the page down (between MIN_SCALE and 1)             
				view.setScaleX(scaleFactor);            
				view.setScaleY(scaleFactor);              // Fade the page relative to its size.             
				view.setAlpha(MIN_ALPHA +(scaleFactor - MIN_SCALE) / (1 - MIN_SCALE) * (1 - MIN_ALPHA));       
			} else { // (1,+Infinity]             // This page is way off-screen to the right.            
				view.setAlpha(0);        
			} 
		}
	}

	private void initData(){
		for(int i=0;i<5;i++){
			View view=LayoutInflater.from(this).inflate(R.layout.activity_viewpager_item, null);
			view.setTag("索引:"+i);
			listView.add(view);

			List<String> listStation=new ArrayList<String>();
			for(int j=0;j<50;j++){
				listStation.add("站点:"+j);
			}
			listStations.add(listStation);
		}

		viewPager.setAdapter(new PagerAdapter() {

			@Override
			public boolean isViewFromObject(View arg0, Object arg1) {
				return arg0==arg1;
			}

			@Override
			public int getCount() {
				return listView.size();
			}

			@Override
			public Object instantiateItem(ViewGroup container, final int position) {
				View view=listView.get(position);
				ListView lv= (ListView) view.findViewById(R.id.listView1);
				lv.setAdapter(new BaseAdapter() {

					@Override
					public View getView(int p, View convertView, ViewGroup parent) {
						if(convertView==null){
							convertView=LayoutInflater.from(ViewPagerActivity.this).inflate(android.R.layout.simple_list_item_1, null);
						}

						((TextView)convertView.findViewById(android.R.id.text1)).setText(listStations.get(position).get(p));
						return convertView;
					}

					@Override
					public long getItemId(int p) {
						return p;
					}

					@Override
					public Object getItem(int p) {
						// TODO Auto-generated method stub
						return listStations.get(position).get(p);
					}

					@Override
					public int getCount() {
						return listStations.get(position).size();
					}
				});
				container.addView(listView.get(position));

				return listView.get(position);
			}

			@Override
			public void destroyItem(ViewGroup container, int position,
					Object object) {
				container.removeView(listView.get(position));
			}
		});
		viewPager.setCurrentItem(0);
	}

}
dandan5238 2013-05-20
  • 打赏
  • 举报
回复
谢谢你的回答,这样不是还是全在viewpage后台吗?
franzhong 2013-05-20
  • 打赏
  • 举报
回复
myViewPager.setOnPageChangeListener 里面有 public void onPageSelected(final int arg0) 在这里定义对应的事件试试 给你举个小例子吧,你参考一下: 我的layout1里有imageView1 layout2里有imageView2... 我要给他们绑定点击事件,绑在外面,切换就清失了,因为view改变了

myViewPager.setOnPageChangeListener(new OnPageChangeListener() {	
        	@Override
			public void onPageSelected(final int arg0) {
				View v = mListViews.get(arg0);
				final ImageView iv = (ImageView) findViewById(getResources().getIdentifier("imageView"+(arg0+1), "id", "com.android.testPackage"));
iv.setOnClickListener(new View.OnClickListener(){
					@Override
					public void onClick(View v) {
......//so on
dandan5238 2013-05-20
  • 打赏
  • 举报
回复
没人回答一个吗?

80,471

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧