ViewPager和片段onClickListener无法正常工作 [英] ViewPager and Fragment onClickListener not working right
问题描述
我绝望了.我试图在Fragment类中添加onClickListener
.
我的想法是我有一个ViewPager
带有图像.我想要的只是单击图像本身,并显示一条祝酒消息.我知道您无法将OnClickListener
注册到ViewPager
本身,因此我尝试将其添加到处理ImageView
的Fragment
类中.
现在发生的是,onClick
方法有效,如果我单击其中一张图像,它会显示一条消息,但会一直显示我使用的DEFAULT开关情况.我只是不能为我的生活而明白为什么……! :(
这是代码,也许您可以看到解决方案?
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?
谢谢.
MainActivity:
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实现的Fragment类:
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;
}
}
}
推荐答案
我认为在您的onclick方法中,v.getId()
(被单击视图的ID)总是返回R.id.imageView1,这就是为什么您总是得到onClick中的默认开关大小写.
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.
您将onClickListener设置为imageView,但是您忘记更改imageview的ID,因此该ID仍为R.id.imageView1,并且侦听器无法正确处理它.
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.
尝试像这样编辑onCreateView方法的switch语句:
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;
}
这篇关于ViewPager和片段onClickListener无法正常工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!