2012-11-27 54 views
9

Android geliştirme konusunda oldukça yeniyim ve şu anda dokunmatik/dokunma olaylarını nasıl ele alabildiğimi anlamaya çalışmak için bir viewpager ile çalışıyorum. Bütün sabah bunu cevaplamak için harcadım ve bana yardımcı olan hiçbir şey bulamıyorum.Bir görüntüleyici içindeki dokunma/dokunma olaylarını algılama

Temel olarak, hepsinin aynı düzeni kullanan 5 parçalı bir görüntüleme cihazım var. Tek yapmak istediğim, sabit görünümde bir dokunma/dokunma olduğunda algılayabiliyor (bir görünüm sürüklendiğinde herhangi bir algılamanın olmasını istemiyorum).

Topladığım kadarıyla, tüm dokunma olaylarını varsayılan olarak engelleyen ViewPager ile ilgili bir sorun var gibi görünüyor. Bunu kullanarak ele alınabilir inanıyoruz:

myPager.requestDisallowInterceptTouchEvent(true); 

İlk başta OnTouchListener ile amatörce ve onTouch yöntemi şimdiye vuruldu olmadığını log çalıştı - bu değil ortaya çıktı. GestureDetector sınıfının bu soruna bir çözüm olarak çok fazla atıldığını gördüm ama açıkçası kendimi bunalmış hissediyorum ve burada hangi sınıfları/arayüzleri kullanacağımı bilmiyorum.

Tüm yapmak istediğim, bir ViewPager kullanırken basit dokunma/vurma olayları almaktır.

Şu anda android geliştirici sitesinden Animasyon öğretici kodunun değiştirilmiş bir sürümünü kullanıyorum. Bu benim MainActivity.java içinde dosyası budur:

package com.example.pbinteractive; 

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentStatePagerAdapter; 
import android.support.v4.view.PagerAdapter; 
import android.support.v4.view.ViewPager; 

public class MainActivity extends FragmentActivity { 
    /** 
    * The number of pages (wizard steps) to show in this demo. 
    */ 
    private static final int NUM_PAGES = 5; 

    /** 
    * The pager widget, which handles animation and allows swiping horizontally to access previous 
    * and next wizard steps. 
    */ 
    private ViewPager mPager; 

    /** 
    * The pager adapter, which provides the pages to the view pager widget. 
    */ 
    private PagerAdapter mPagerAdapter; 

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

     // Instantiate a ViewPager and a PagerAdapter. 
     mPager = (ViewPager) findViewById(R.id.pager); 
     mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager()); 
     mPager.setAdapter(mPagerAdapter);  
    } 

    /** 
    * A simple pager adapter that represents 5 {@link ScreenSlidePageFragment} objects, in 
    * sequence. 
    */ 
    private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter { 
     public ScreenSlidePagerAdapter(FragmentManager fm) { 
      super(fm); 
     }   

     @Override 
     public Fragment getItem(int position) { 
      return MyPageFragment.create(position); 
     } 

     @Override 
     public int getCount() { 
      return NUM_PAGES; 
     } 
    } 
} 

Ve bu benim MyPageFragment.java içinde dosyası budur: Ben ikisini de kontrol ettik

Bilginize
package com.example.pbinteractive; 

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnTouchListener; 
import android.view.ViewGroup; 

public class MyPageFragment extends Fragment implements OnTouchListener { 
    /** 
    * The argument key for the page number this fragment represents. 
    */ 
    public static final String ARG_PAGE = "page"; 

    /** 
    * The fragment's page number, which is set to the argument value for {@link #ARG_PAGE}. 
    */ 
    private int mPageNumber; 

    /** 
    * Factory method for this fragment class. Constructs a new fragment for the given page number. 
    */ 
    public static MyPageFragment create(int pageNumber) { 
     MyPageFragment fragment = new MyPageFragment(); 
     Bundle args = new Bundle(); 
     args.putInt(ARG_PAGE, pageNumber); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    public MyPageFragment() { 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mPageNumber = getArguments().getInt(ARG_PAGE); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     // Inflate the layout containing a title and body text. 
     ViewGroup rootView = (ViewGroup) inflater 
       .inflate(R.layout.fragment_slide, container, false); 

     // Set the title view to show the page number. 
     //((TextView) rootView.findViewById(android.R.id.text1)).setText(
     //  getString(R.string.title_template_step, mPageNumber + 1)); 

     return rootView; 
    } 

    /** 
    * Returns the page number represented by this fragment object. 
    */ 
    public int getPageNumber() { 
     return mPageNumber; 
    } 

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

Bu kaynaklar, çoğu zaman karşılaştığım problem için en iyi çözüm olarak göründükleri gibi (toplayabildiğimden):

android: ViewPager and HorizontalScrollVIew

Ancak onlardan fazla yardım alamadım. Dediğim gibi ben android ile çalışmak için oldukça yeni oldum, bu yüzden sadece temelleri tanımak istiyorum!

Teşekkür

DÜZENLEME: Sadece ben her fragmanı içinde dokunmatik olayları almak istiyorum netleştirmek için ben bu kafesten kurtulabilmek kez beri süre çalıştıktan dokunmatik etkinlik için bazı parçaları istiyorum diğerleri yanıt vermeyen içeriği gösterecek.

+0

Sadece viewpager'a dokunmak ister misiniz? veya içindeki fragmanlar? – Yahor10

+0

sadece düzenlenmiş :-) – alimac83

cevap

8
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
// Inflate the layout containing a title and body text. 
ViewGroup rootView = (ViewGroup) inflater 
       .inflate(R.layout.fragment_slide, container, false); 
LinearLayout layout = (LinearLayout)rootView.findViewById(R.id.layout)// get your root layout 
layout.setOnTouchListener(new OnTouchListener() { 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      Log.v(null, "TOUCH EVENT"); // handle your fragment number here 
      return false; 
     } 
    }); 
     return rootView; 
    } 
+0

Teşekkürler Yahor! Dokunma olayını şimdi hallediyor ama aynı zamanda tokatlamak üstünde kalıyor. Görünüm kaydırıldığında dokunmatik ekranı görmezden gelebilir, ancak görüntü sabitken bunu algılayabilir mi? – alimac83

+4

MotionEvent kodu (event == MotionEvent.ACTION_DOWN) // if (if = event == MotionEvent.MOVE) // if ( – Yahor10

+0

aha) 'yı işaretleyin. Çok teşekkürler! – alimac83