问题
Im desperate. Im trying to add an onClickListener
in a Fragment class.
The idea is that I have a ViewPager
with images. All I want is to click on an image itself and have it display a toast message. I know you cant register an OnClickListener
to the ViewPager
itself, so I tried adding it in the Fragment
class that handles the ImageView
.
What happens now is, the onClick
method works, if I click on one of the images, it displays a message, but it keeps displaying the DEFAULT switch case I use. I just cant for the life of me understand why......! :(
Here's the code maybe you can see a solution?
Thanks.
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;
}
}
}
And here is the Fragment class with the OnClickListener implementation:
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;
}
}
}
回答1:
I think that in your onclick method, v.getId()
(id of clicked view) returns always R.id.imageView1, that is why you are always getting the default switch case in onClick.
You set onClickListener to your imageView, but you forgot to change the id of the imageview so the id is still R.id.imageView1 and your listener cannot handle it properly.
Try to edit switch statement of your onCreateView method like this:
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;
}
来源:https://stackoverflow.com/questions/15661895/viewpager-and-fragment-onclicklistener-not-working-right