2013-03-27 2 views
0

Im в отчаянии. Я пытаюсь добавить onClickListener в класс Fragment. Идея в том, что у меня есть ViewPager с изображениями. Все, что я хочу, - это щелкнуть по самому изображению и показать ему тост-сообщение. Я знаю, что вы не можете зарегистрировать OnClickListener самому ViewPager, поэтому я попытался добавить его в класс Fragment, который обрабатывает ImageView. Что происходит сейчас, метод onClick работает, если я нажимаю на одно из изображений, он отображает сообщение, но он продолжает отображать ящик переключателя DEFAULT, который я использую. Я просто не могу, чтобы жизнь меня поняла, почему ......! :( Вот код, может быть, вы можете увидеть решениеViewPager и фрагмент onClickListener не работает правильно

Благодаря

MainActivity:.

package com.example.viewpagerexample; 

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.FragmentPagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 

public class MainActivity extends FragmentActivity{ 

private static final int NUM_PAGES = 5; 

private MyAdapter mAdapter; 
private ViewPager mPager; 

private Button leftBTN; 
private Button rightBTN; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    mAdapter = new MyAdapter(getSupportFragmentManager()); 
    mPager = (ViewPager) findViewById(R.id.pager); 
    mPager.setAdapter(mAdapter); 


    leftBTN = (Button)findViewById(R.id.leftBTN); 
    leftBTN.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      mPager.setCurrentItem(mPager.getCurrentItem()-1, true); 
     } 
    }); 

    rightBTN = (Button)findViewById(R.id.rightBTN); 
    rightBTN.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      mPager.setCurrentItem(mPager.getCurrentItem()+1, true); 
     } 
    }); 
} 

public static class MyAdapter extends FragmentPagerAdapter { 

    public MyAdapter(FragmentManager fm) { 
     super(fm); 
    } 

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

    @Override 
    public Fragment getItem(int position) { 
     ImageFragment myFragment = new ImageFragment(); 
     Bundle data = new Bundle(); 
     data.putInt("current_page", position); 
     myFragment.setArguments(data); 
     return myFragment; 
    } 
} 
} 

А вот класс фрагмент с реализацией OnClickListener:

package com.example.viewpagerexample; 

import com.example.viewpagerexample.R; 

import android.annotation.SuppressLint; 
import android.media.MediaPlayer; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.webkit.WebView.FindListener; 
import android.widget.ImageView; 
import android.widget.Toast; 


public class ImageFragment extends Fragment implements OnClickListener{ 

private int position; 
private ImageView imageView; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Bundle data = getArguments(); 
    position = data.getInt("current_page", 0); 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.image_details, container, false); 
    imageView = (ImageView) view.findViewById(R.id.imageView1); 
    imageView.setOnClickListener(this); 

    switch (position) { 
    case 0: 
     imageView.setImageResource(R.drawable.splash); 
     return view; 
    case 1: 
     imageView.setImageResource(R.drawable.girrafe); 
     return view; 
    case 2: 
     imageView.setImageResource(R.drawable.lion); 
     return view; 
    case 3: 
     imageView.setImageResource(R.drawable.monkey); 
     return view; 
    case 4: 
     imageView.setImageResource(R.drawable.chicken); 
     return view; 
    default: 
     return null; 
    } 
} 

@Override 
public void onClick(View v) { 
    switch (v.getId()){ 
    case R.drawable.splash: 
     Log.d("DEBUG", "image 0 pressed"); 
    Toast.makeText(getActivity(), "Pic 1", Toast.LENGTH_SHORT).show(); 
     return; 
    case R.drawable.girrafe: 
     Log.d("DEBUG", "image 1 pressed"); 
     Toast.makeText(getActivity(), "Pic 2", Toast.LENGTH_SHORT).show(); 
     return; 
    case R.drawable.lion: 
     Log.d("DEBUG", "image 2 pressed"); 
     Toast.makeText(getActivity(), "Pic 3", Toast.LENGTH_SHORT).show(); 
     return; 
    case R.drawable.monkey: 
     Log.d("DEBUG", "image 3 pressed"); 
     Toast.makeText(getActivity(), "Pic 4", Toast.LENGTH_SHORT).show(); 
     return; 
    case R.drawable.chicken: 
     Log.d("DEBUG", "image 4 pressed"); 
     Toast.makeText(getActivity(), "Pic 5", Toast.LENGTH_SHORT).show(); 
     return; 
    default: 
     Log.d("DEBUG", "v.getId(): " + v.getId()); 
     Log.d("DEBUG", "default pressed"); 
     Toast.makeText(getActivity(), "DEFAULT pressed!", Toast.LENGTH_SHORT).show(); 
     return; 
    } 
} 

}

ответ

0

Я думаю, что в вашем onclick мне thod, v.getId() (id от щелчка) возвращает всегда R.id.imageView1, поэтому вы всегда получаете случай переключения по умолчанию в onClick.

Вы устанавливаете onClickListener на изображение, но вы забыли изменить идентификатор изображения, так что идентификатор все еще остается R.id.imageView1, и ваш слушатель не может обработать его должным образом.

Попробуйте изменить переключатель заявление вашего onCreateView метода, как это:

switch (position) { 
case 0: 
    imageView.setImageResource(R.drawable.splash); 
    imageView.setId(R.drawable.splash); 
    return view; 
case 1: 
    imageView.setImageResource(R.drawable.girrafe); 
    imageView.setId(R.drawable.girrafe); 
    return view; 
case 2: 
    imageView.setImageResource(R.drawable.lion); 
    imageView.setId(R.drawable.lion); 
    return view; 
case 3: 
    imageView.setImageResource(R.drawable.monkey); 
    imageView.setId(R.drawable.monkey); 
    return view; 
case 4: 
    imageView.setImageResource(R.drawable.chicken); 
    imageView.setId(R.drawable.chicken); 
    return view; 
default: 
    return null; 
} 
+1

СЛАДКОЕ !!! Это сработало отлично! Но как я должен был знать это ??? :) Большое вам спасибо! Один маленький вопрос, если я хочу воспроизвести звук вместо сообщения Toast msg, следует ли использовать SoundPool или MediaPlayer? Его короткий звук. –

+0

Я использую MediaPLayer для воспроизведения звуков в своих приложениях, мне кажется, что проще использовать MediaPlayer, но я не настолько разбираюсь в использовании SoundPool, возможно, лучший способ - это изучить его самостоятельно. :) –

+0

Согласен :) Еще раз спасибо! –