1

ここで非常に多くの質問を見てきましたが、何を探しているのか正確にはわかりません。

ViewPager を使用するシンプルなアプリがあります。3 つのタブがあり、各タブにフラグメントがあります。最初のフラグメントには、ListView が含まれています。ListView の要素をクリックして、別のフラグメントに移動できるようにしたいと考えています。

したがって、基本的には、要素がクリックされたら ListView を含むフラグメントを削除し、新しいフラグメントを追加したいと考えています。私はこれをいくつかの異なる方法で実行しようとしましたが、何も機能しませんでした。

最後に試したのは、要素がクリックされたら TabsPageAdapter を編集することでした。これは、戻るボタンを押してアプリを終了する場合を除いて、ほとんど機能します。また、これを行う最もクリーンな方法とは思えません。

TabsPagerAdapter

public class TabsPagerAdapter extends FragmentStatePagerAdapter {

SherlockFragment mf;
TalkingPointsFragment tpf;
ContactFragment gf;
int mode = 0; 

public TabsPagerAdapter(FragmentManager fm) {
    super(fm);
    mf = new CanvassFragment();
    tpf = new TalkingPointsFragment();
    gf = new ContactFragment();
}

public TabsPagerAdapter(FragmentManager fm, int mode)
{
    super(fm);
    if(mode == 0)
    {
    mf = new CanvassFragment();
    tpf = new TalkingPointsFragment();
    gf = new ContactFragment();
    }
    else if(mode == 1)
    {
        mf = new ContactFragment();
        tpf = new TalkingPointsFragment();
        gf = new ContactFragment();
    }
}

@Override
public SherlockFragment getItem(int index) {

    switch (index) {
    case 0:
        return mf;
    case 1:
        return tpf;
    case 2:
        return gf;
    }

    return null;
}

@Override
public int getCount() {
    // get item count - equal to number of tabs
    return 3;
}

@Override
public void destroyItem(ViewGroup container, int position, Object object)
{

}
}

onclick コード:

ViewPager viewp = (ViewPager) getActivity().findViewById(R.id.pager);
TabsPagerAdapter mAdapter = new TabsPagerAdapter(getActivity().getSupportFragmentManager(),1);

viewp.setAdapter(mAdapter);
mAdapter.notifyDataSetChanged();

layout_main.xml

<android.support.v4.view.ViewPager
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:actionBarTabStyle="@drawable/actionbar_tab_indicator">

4

2 に答える 2

0

わかりましたので、これには私が想像していたよりも少し多くのコードが必要でした。アイデアが得られることを願っています:

public class MainClass extends FragmentActivity implements CanvassCallback {

// save a single reference to ViewPager and TabsPagerAdapter
private ViewPager mViewPager;
private TabsPagerAdapter mAdapter;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    this.mViewPager = (ViewPager) findViewById(R.id.pager);
    this.mAdapter = new TabsPagerAdapter(getSupportFragmentManager(), this);
    mViewPager.setAdapter(mAdapter);

    ...
}

// from the CanvassCallback interface
public void itemSelected() {
    mAdapter.canvassSelected();
    mAdapter.notifyDataSetChanged();
}

    @Override
public void onBackPressed() {
    if (mViewPager.getCurrentItem() == 0 && mAdapter.isCanvassSelected() {
        mAdapter.canvassSelected();
        mAdapter.notifyDataSetChanged();
            }
            else {
                super.onBackPressed();
            }
}

}

コールバックを示す CanvassFragment のモックアップ

public class CanvassFragment extends SherlockFragment {

public interface CanvassCallback {
    public void itemSelected();
}

private CanvassCallback canvassCallback;

public void setCanvassCallback(CanvassCallback canvassCallback) {
    this.canvassCallback = canvassCallback;
}

...

// The onClick of your item
private void onClick() {
    // notify your activity that an item was selected
    canvassCallback.itemSelected();
}
}

registeredFragments は厳密には必要ありませんが、アクティビティから Fragment のメソッドを呼び出す必要がある場合は、ある程度の価値があると思います。

public class TabsPagerAdapter extends FragmentStatePagerAdapter {

// see upvoted answer from http://stackoverflow.com/questions/8785221/retrieve-a-fragment-from-a-viewpager
SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>();

private boolean canvassSelected = false; 

private CanvassCallback canvassCallback;

public TabsPagerAdapter(FragmentManager fm, CanvassCallback canvassCallback) {
    super(fm);
    this.canvassCallback = canvassCallback;
}

public void canvassSelected() {
    canvassSelected = !canvassSelected;
}

    public boolean isCanvassSelected() {
            return canvassSelected;
    }

@Override
public SherlockFragment getItem(int index) {

    switch (index) {
    case 0:
        if (canvassSelected) 
            return new ContactFragment();

        CanvassFragment canvassFragment = new CanvassFragment();
        // this ensures that your Activity gets notified when an item is clicked
        canvassFragment.setCanvassCallback(canvassCallback);
        return canvassFragment;
    case 1:
        return new TalkingPointsFragment();
    case 2:
        return new ContactFragment();
    }

    return null;
}

@Override
public int getCount() {
    // get item count - equal to number of tabs
    return 3;
}

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

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

}
于 2013-11-02T00:39:15.370 に答える
0

FragmentStatePagerAdapter も使用し、ユーザーが ActionBar からマップを選択すると、FragmentStatePagerAdapter の上に GoogleMapsFragment を追加します。

        // create a new map
        mapsFragment = GoogleMapFragment.newInstance();
        // Then we add it using a FragmentTransaction.
        FragmentTransaction fragmentTransaction = getSupportFragmentManager()
                .beginTransaction();
        fragmentTransaction.add(android.R.id.content, mapsFragment,
                FRAGMENT_MAP_TAG);
        fragmentTransaction.commit();

あなたの場合、おそらくバックスタックにも追加する必要がありますが、私のアプリではユーザーが ActionBar を使用して戻る必要があるため、これはありません。

このアプローチは、ユーザーがリストからアイテムを選択したときにも機能すると考えました。

もちろん、これには、ユーザーが戻るまで FragmentStatePagerAdapter を使用できないという欠点があります。したがって、それがあなたのアプリに受け入れられるかどうかはわかりません。

于 2013-11-01T22:34:08.267 に答える