마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

정말 모르겠습니다....

0 추천

안녕하세요 초보개발자입니다..

일단 소스부터 보시죠..

@Override
 public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     // TODO Auto-generated method stub
     setContentView(R.layout.activity_detail_product);
     am.addactivity(this);
     try {
      //listview header setting
      Intent intent = getIntent();
      String strdata = intent.getExtras().getString("selectitem");
      
   int selectposition = intent.getExtras().getInt("selectposition");
      JSONArray dataarray = new JSONArray(strdata);
      detail_pager = (ViewPager)findViewById(R.id.detail_pager);
      adapter = new ViewPagerAdaper(this);
      detail_pager.setAdapter(adapter);

activity

package com.newtalktalk.adapter;

import com.activity.intro.R;

import android.content.Context;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;

public class ViewPagerAdaper extends PagerAdapter implements OnTouchListener{

 private Context mcon;
 private LayoutInflater mInflater;
 private ViewPager testpager;
 private testpageradapter adapter;
 
 
 public ViewPagerAdaper(Context conn) {
  // TODO Auto-generated constructor stub
  this.mcon = conn;
  mInflater = LayoutInflater.from(conn);
 }
 
 @Override
 public int getCount() {
  // TODO Auto-generated method stub
  return 3;
 }
 
 @Override
 public Object instantiateItem(View pager, int position) {
  // TODO Auto-generated method stub
  View view = null;
  try{
   view = mInflater.inflate(R.layout.detailproduct_listview_header, null);
   testpager = (ViewPager)view.findViewById(R.id.testpager);
   adapter = new testpageradapter(mcon);
   testpager.setAdapter(adapter);
   testpager.setOnTouchListener(this);
   if(position == 0){
    
   }else{
    
   }
  }catch (Exception e) {
   // TODO: handle exception
   Log.d("ErrorLog", "ViewPagerAdapter : " + e.toString());
  }
  ((ViewPager)pager).addView(view, 0);
  return view; 
 }
 //뷰 객체 삭제
 @Override
 public void destroyItem(View pager, int position, Object view) {
  // TODO Auto-generated method stub
  ((ViewPager)pager).removeView((View)view);
 }
 
 @Override
 public boolean isViewFromObject(View pager, Object obj) {
  // TODO Auto-generated method stub
  return pager == obj;
 }

 @Override
 public boolean onTouch(View v, MotionEvent event) {
  // TODO Auto-generated method stub
  Log.d("--", "main touch");
  return false;
 }
}

viewpager1번 adapter

 

package com.newtalktalk.adapter;

import com.activity.intro.R;

import android.content.Context;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageButton;

public class testpageradapter extends PagerAdapter{

 private Context mcon;
 private LayoutInflater mInflater;
 
 public testpageradapter(Context conn) {
  // TODO Auto-generated constructor stub
  this.mcon = conn;
  mInflater = LayoutInflater.from(conn);
 }
 
 @Override
 public int getCount() {
  // TODO Auto-generated method stub
  return 2;
 }
 
 @Override
 public Object instantiateItem(View pager, int position) {
  // TODO Auto-generated method stub
  View view = null;
  try{
   view = mInflater.inflate(R.layout.detailproduct_titleimg, null);
   if(position == 0){
    ImageButton testid = (ImageButton)view.findViewById(R.id.testid) ;
//    testid.setOnTouchListener(this);
   }else{
    
   }
  }catch (Exception e) {
   // TODO: handle exception
   Log.d("ErrorLog", "ViewPagerAdapter : " + e.toString());
  }
  ((ViewPager)pager).addView(view, 0);
  return view;
 }
 
 
 //뷰 객체 삭제
 @Override
 public void destroyItem(View pager, int position, Object view) {
  // TODO Auto-generated method stub
  ((ViewPager)pager).removeView((View)view);
 }
 
 @Override
 public boolean isViewFromObject(View pager, Object obj) {
  // TODO Auto-generated method stub
  return pager == obj;
 }
}

viewpager2번 adapter입니다..

제가 원하는 그림은..

 

이런그림인데요..

viewpager 2개가 따로 좌우로 스크롤 되기를 원합니다..

 이벤트를 가로채거나 우선순위를 정해줘야 하는데..

별에 별 방법을 다 써봐도..도저히 안되네요..ㅠㅠ

도와주세요..ㅠㅠ

mamongs (4,050 포인트) 님이 2013년 8월 5일 질문

1개의 답변

0 추천

이전에 올리신 질문에 답변드렸는데 확인해보셧나요

 

viewpager2.setOnTouchListener(new OnTouchListener() {
             
	public boolean onTouch(View v, MotionEvent event) {
		// TODO Auto-generated method stub
                viewpager1.requestDisallowInterceptTouchEvent(true);
                return false;
	}
});

 

얼룩돼지 (15,720 포인트) 님이 2013년 8월 5일 답변
네..ㅠㅠ 확인해보고 같은방법으로 해봣는데
작동이 되지 않네요 ㅠㅠ 이것저것 다해봐서 소스가 엉망이라 죄송합니다 ㅠㅠ
음... ViewPager는 ListView나 GridView와 다르게
자신한테 말고 instantiateItem에서 생성되는 뷰에다가 리스너를 설정하던데
그런식으로는 해보셧나요?
pager2itemView..setOnTouchListener(new OnTouchListener() {
              
    public boolean onTouch(View v, MotionEvent event) {
        // TODO Auto-generated method stub
                pager1ItemView.requestDisallowInterceptTouchEvent(true);
                return false;
    }
});
네..혹시나 해서 다시 해봤는데 안되네요 ㅠㅠ
하아.. pager1아답터에서 pager2의 터치 이벤트를 줬는데요
터치가 안먹네요;; 이 부분때문에 문제인건가요?;;
pager1에서 이벤트를 가로채서 page2이벤트가 안먹는것 같은데..
ㅠㅠㅠㅠ
instantiateItem에서 생기는 View마다
pager1itemView..setOnTouchListener(new OnTouchListener() {
              
    public boolean onTouch(View v, MotionEvent event) {
        // TODO Auto-generated method stub
                Log.d(TAG, "pager1 첫번째아이템"
                return false;
    }
});
이런식으로 이너클래스사용해서 각각 리스너 설정후
어디서 이벤트가 일어나는것인지 알아보세요.
돼지님이 알려주신

View view = null;
        try{
            view = mInflater.inflate(R.layout.detailproduct_listview_header, null);
            testpager = (ViewPager)view.findViewById(R.id.testpager);
            adapter = new testpageradapter(mcon);
            testpager.setAdapter(adapter);
            testpager.setOnTouchListener(new OnTouchListener() {
               
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    // TODO Auto-generated method stub
                    ((ViewGroup) v).requestDisallowInterceptTouchEvent(true);
                    return false;
                }
            });
           
            if(position == 0){
               
            }else{
               
            }
        }catch (Exception e) {
            // TODO: handle exception
            Log.d("ErrorLog", "ViewPagerAdapter : " + e.toString());
        }
        ((ViewPager)pager).addView(view, 0);
        return view;

를 사용하게 되면 로그가 찍히지 않구요..
사용하지 않고 그냥 이벤트를 걸엇을경우엔 viewpager1에서 이벤트가 발생합니다..ㅠㅠ 이것두 태스트 해봣어요 흐엉 ㅠㅠㅠㅠ
주체를 잘 파악하셔야합니다.
이너클래스의 경우 뷰나 레이아웃에 리스너를 설정하는거라
해당 뷰나 레이아웃에서 일어나는 터치만 컨트롤하지만
위같이 아답터의경우는 잘모르겟지만 Activity안에서 onTouch를 오버라이딩해서 사용할경우 Activity안에서 일어나는 터치를 전부 그곳에서 컨트롤 하게 되겠죠.
예를들어 Activity안에 onTouch를 오버라이딩하고 뷰a, 뷰b에
리스너를 위와같이 this 인자를 사용해서 설정하면 뷰a나 뷰b에서 터치가
일어나면 Activity의 onTouch에서  두 뷰의 터치이벤트 모두를 컨트롤 할수있습니다.
현재같은 경우에는 뷰페이저 말고 instantiateItem에서 생성되는 view에 이너클래스로 리스너를 설정해보세요. 그리고 pager1, pager2에서 똑같은 아답터를 사용하면 확인이 어려우니 아답터 클래스 복사해서 하나더만드시고 로그 문구만 바꿔서 확인해보세요
귀한시간 내주셔서 정말 감사합니다.
곰곰히 생각해본결과.... layout이 현재 되어있는게..
pager1 -> 스크롤뷰 (안에 pager2) 이런구조로 되어있었습니다..
그래서 말씀해주신대로 activity에서 ontouch이벤트를 확인해본결과
pager1 스크롤뷰 는 이벤트가 제대로 작동하지만
pager2이벤트는 작동하지않고 pager1이벤트로 들어가더군요..

instantiateItem 내용입니다..
view = mInflater.inflate(R.layout.detailproduct_listview_header, null);
            testscroll = (ScrollView)view.findViewById(R.id.testscroll);
           
           
            testpager = (ViewPager)view.findViewById(R.id.testpager);
            adapter = new testpageradapter(mcon);
            testpager.setAdapter(adapter);
           
           
            testscroll.setOnTouchListener((OnTouchListener) mcon);
            testpager.setOnTouchListener((OnTouchListener) mcon);

메인액티비티 내용이구요..

@Override
    public boolean onTouch(View v, MotionEvent event) {
        // TODO Auto-generated method stub
        if(v.getId() == R.id.testscroll){
            Log.d("--", "testscroll");
            ((ViewGroup) v).requestDisallowInterceptTouchEvent(false);
        }else if(v.getId() == R.id.detail_pager){
            ((ViewGroup) v).requestDisallowInterceptTouchEvent(false);
            Log.d("--", "activity detail_pager");
        }else if(v.getId() == R.id.testpager){
            ((ViewGroup) v).requestDisallowInterceptTouchEvent(true);
            Log.d("--", "activity testpager");
        }
        return false;
    }
정말 염치없지만 한번만 더 봐주시면 감사하겠습니다..
...