如何检测Android ViewPager中按下的按钮?

时间:2014-04-07 14:23:49

标签: android android-fragments android-viewpager

我创建了一个使用单个片段的ViewPager。有3个,这是其中一个的例子:

public class PainFragment extends Fragment {

    private TextView mTxtScale;
    private Button mBtnMinus;
    private Button mBtnPlus;
    private int mScale;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_pain, container, false);

        mTxtScale = (TextView)v.findViewById(R.id.scale);
        mBtnMinus = (Button)v.findViewById(R.id.minus);
        mBtnPlus = (Button)v.findViewById(R.id.plus);
        mScale = Integer.valueOf(mTxtScale.getText().toString());

        mBtnMinus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mScale--;
                if(mScale == -1) {
                    mScale = 9;
                }
                mTxtScale.setText(String.valueOf(mScale));
            }
        });

        mBtnPlus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mScale++;
                if(mScale == 10) {
                    mScale = 0;
                }
                mTxtScale.setText(String.valueOf(mScale));
            }
        });


        return v;
    }

    public static PainFragment newInstance(String text) {

        PainFragment f = new PainFragment();
        Bundle b = new Bundle();
        //b.putString("msg", text);

        f.setArguments(b);

        return f;
    }

    public int getScale() {

        int scale = Integer.valueOf(mTxtScale.getText().toString());
        return scale;
    }

我在MainFragment中实例化了ViewPager:

public class MainFragment extends Fragment {

    Entry mEntry = new Entry();
    ViewPager mPager;
    JournalPagerAdapter mAdapter;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.fragment_main_screen, container, false);

        mPager = (ViewPager)rootView.findViewById(R.id.pager);
        mPager.setOffscreenPageLimit(2); // So all 3 pages are loaded at once.
        mAdapter = new JournalPagerAdapter(getActivity().getSupportFragmentManager());

        mPager.setAdapter(mAdapter);
        ...

我在ViewPager片段中有按钮单击侦听器。我想知道设置监听器的最佳方法,以便我的主片段可以检测何时按下某个ViewPager片段上的按钮。

/ **更新 - 这是我的适配器类** /

public class JournalPagerAdapter extends FragmentPagerAdapter {

    SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>();

    public JournalPagerAdapter(FragmentManager mgr) {
        super(mgr);
    }
    @Override
    public Fragment getItem(int pos) {
        switch(pos) {

            case 0: return PainFragment.newInstance("PainFragment");
            case 1: return StressFragment.newInstance("StressFragment");
            case 2: return SleepFragment.newInstance("SleepFragment");
            default: return PainFragment.newInstance("PainFragment");
        }
    }

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

    /* Thanks to Streets of Boston (http://stackoverflow.com/questions/8785221/retrieve-a-fragment-from-a-viewpager)
     * for the next 3 methods, should include in all PagerAdapters. Let's you get the fragment instances by position */

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        Fragment fragment = (Fragment) super.instantiateItem(container, position);
        registeredFragments.put(position, fragment);
        return fragment;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        registeredFragments.remove(position);
        super.destroyItem(container, position, object);
    }

    public Fragment getRegisteredFragment(int position) {
        return registeredFragments.get(position);
    }

}

2 个答案:

答案 0 :(得分:1)

实现这一目标的正确方法可能是通过使用回调。您的片段将使用普通的点击监听器,然后使用回调来回传给托管活动。

请参阅有关从片段传回活动的Android文档;然后活动可以将它传达给其他碎片。

http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity

  

在某些情况下,您可能需要一个片段来与活动共享事件。一种好方法是在片段内定义一个回调接口,并要求主机活动实现它。当活动通过接口收到回调时,它可以根据需要与布局中的其他片段共享信息。

答案 1 :(得分:1)

使用ClickListener而不是Callback的伪示例的第二个答案。这应该让你保持活动的所有逻辑。

在MainFragment中实现OnClickListener接口。将OnClickListener添加到JournalPagerAdapter构造函数中。据推测,适配器正在创建PainFragments。将OnClickListener添加到PainFragment newInstance并让Adapter在创建每个PainFragment时提供它。

public class PainFragment extends Fragment {

private TextView mTxtScale;
private Button mBtnMinus;
private Button mBtnPlus;
private int mScale;
protected OnClickListener mainClickListener;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_pain, container, false);

    mTxtScale = (TextView)v.findViewById(R.id.scale);
    mBtnMinus = (Button)v.findViewById(R.id.minus);
    mBtnPlus = (Button)v.findViewById(R.id.plus);
    mScale = Integer.valueOf(mTxtScale.getText().toString());

    mBtnMinus.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            mScale--;
            if(mScale == -1) {
                mScale = 9;
            }
            mTxtScale.setText(String.valueOf(mScale));
            mainClickListener.onClick(view);
        }
    });

    mBtnPlus.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            mScale++;
            if(mScale == 10) {
                mScale = 0;
            }
            mTxtScale.setText(String.valueOf(mScale));
            mainClickListener.onClick(view);
        }
    });


    return v;
}

public static PainFragment newInstance(String text, OnClickListener onClickListener) {

    PainFragment f = new PainFragment();
    f.mainClickListener = onClickListener;

    Bundle b = new Bundle();        
    //b.putString("msg", text);

    f.setArguments(b);

    return f;
}

public int getScale() {



public class MainFragment extends Fragment implements OnClickListener {

Entry mEntry = new Entry();
ViewPager mPager;
JournalPagerAdapter mAdapter;

    @Override
public void onClick(View v) 
{
    // TODO Auto-generated method stub
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View rootView = inflater.inflate(R.layout.fragment_main_screen, container, false);

    mPager = (ViewPager)rootView.findViewById(R.id.pager);
    mPager.setOffscreenPageLimit(2); // So all 3 pages are loaded at once.
    mAdapter = new JournalPagerAdapter(getActivity().getSupportFragmentManager(), this);

    mPager.setAdapter(mAdapter);
    ...



public class JournalPagerAdapter extends FragmentPagerAdapter {

SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>();

private OnClickListener mOnClickListener;

public JournalPagerAdapter(FragmentManager mgr, OnClickListener onClickListener) {
    super(mgr);
    mOnClickListener = onClickListener;
}
@Override
public Fragment getItem(int pos) {
    switch(pos) {

        case 0: return PainFragment.newInstance("PainFragment", mOnClickListener);
        case 1: return StressFragment.newInstance("StressFragment", mOnClickListener);
        case 2: return SleepFragment.newInstance("SleepFragment", mOnClickListener);
        default: return PainFragment.newInstance("PainFragment", mOnClickListener);
    }
}

...