ViewPager and Fragment onClickListener not working right

白昼怎懂夜的黑 提交于 2019-12-08 14:07:08

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!