25

私のアプリケーションでは、ViewPagerを使用しました。好き、

(say main.xml)

<android.support.v4.view.ViewPager
     android:id="@+id/viewPager"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     android:layout_above="@+id/register_header" />

そして、FragmentActivityにViewPagerオブジェクトとViewPagerAdapter(FragmentPagerAdapterを拡張する)オブジェクトを作成します。

_mViewPager = (ViewPager) findViewById(R.id.viewPager);

_adapter = new ViewPagerAdapter(getApplicationContext(),
         getSupportFragmentManager());

_mViewPager.setAdapter(_adapter);

そして、Adapterクラスは次のようなものです。

public class ViewPagerAdapter extends FragmentPagerAdapter {
    private Context _context;
    private FragmentManager manager;
    private Fragment f;
    private String classname="ViewPagerAdapter";
    public ViewPagerAdapter(Context context, FragmentManager fm) {
        super(fm);  
        _context=context;
        manager=fm;
        }
    @Override
    public Fragment getItem(int position) {
        Log.i(classname,"getItem called"+position);
        f = new Fragment();
        f=MyFragment.newInstance();
        Bundle args = new Bundle();
        args.putInt("position", position);
        f.setArguments(args);
        return f;
    }

    @Override
    public int getCount() {
        return User.getPageCount();
    }

    @Override
    public int getItemPosition(Object object) {
        return POSITION_NONE;
    }
}

そして、MyFragmentクラスでは、

onResumeでは、wigetsオブジェクトを共通の静的変数に格納する必要があります。

public void onResume() {
        super.onResume();
        pageIndex = getArguments().getInt("position");      
        User.useTextview1=textview1;
        User.useTextview2= textview2;
        User.current_pageIndex=pageIndex;



    }

FragmentActivityのUserクラスから取得したテキストビューを更新する必要があります。 私の問題は、getItem()メソッドが最初に2回呼び出されることです 。事実上、エミュレーターに表示されるビューは0番目のインデックスですが、FragmentActivityで1番目のインデックス値を取得しました。getItem()メソッドの呼び出しを2回停止すると、FragmentActivityで0番目のインデックスTextView参照を取得できます。

これを行うための最良の方法を教えてください。

ありがとう

4

5 に答える 5

19

開始時に、インデックス0とインデックス1の2をFragmentPagerAdapterインスタンス化します。画面に表示されているからデータを取得する場合は、を使用して現在の位置を取得できます。次に、フラグメントを使用します。呼び出しでその配列を更新します。呼び出されたら、その位置を使用して右への参照を取得し、データを更新します。FragmentsFragmentsetOnPageChangeListenerPagerSparseArrayWeakReferencegetItemonPageSelectedFragmentUser

配列の初期化:

private SparseArray<WeakReference<MyFragment>> mFragments = new SparseArray<WeakReference<MyFragment>>(3);
于 2013-03-05T08:32:25.487 に答える
2

getItem メソッドで私はこれを書きました..

@Override
public Fragment getItem(int index) {
    EditFragment frag = new EditFragment();
    Bundle args = new Bundle();
    args.putSerializable("currentItem", itemsList.get(index));
    frag.setArguments(args);
    return (frag);
}

ここで itemsList.get(index) は、EditFragment クラスで使用するモデル クラス オブジェクトです。これがそれです。

 @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
    View result = inflater.inflate(R.layout.pager_fragment_layout, container, false);
    image = (ImageView)result.findViewById(R.id.pager_image);
    text = (TextView)result.findViewById(R.id.pager_item_desc);
    ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getActivity()).build();
    ImageLoader.getInstance().init(config);
    imLoader = ImageLoader.getInstance();

            ****NOTE
    final SwapItems itemList = (SwapItems) getArguments().getSerializable("currentItem");

    imagePath = itemList.getPaths().get(0);
    imLoader.displayImage(imagePath,image);
    text.setText(itemList.getItemDescription());

    image.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            Fragment fragment = new ItemImagesFragment();
            FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            Bundle bundle = new Bundle();
            bundle.putSerializable("val", itemList);
            fragment.setArguments(bundle);
            fragmentTransaction.replace(R.id.content_frame, fragment);
            fragmentTransaction.addToBackStack(null);
            fragmentTransaction.commit();
        }
    });
    return result;
}

注: ここでは、前の getItem メソッドから swapitems モデル オブジェクトを取得していますが、これは「最終」です。これは私の問題を解決します。以前は、修飾子として static を使用して同じオブジェクトを初期化していました。

あなたもクリアしてほしい

于 2014-04-22T05:53:08.613 に答える
1

私は同じ問題に直面しました - getItem() メソッドが 2 回呼び出されました。私がその方法を使用した目的が、新しいスライドが表示されたときにホスティング アクティビティの変更をトリガーすることであったかどうかはわかりません。

さて、まず getItem() は、新しいスライドが表示されるイベントを取得するための正しいメソッドではありません。

この目的のために、ViewPager 自体で ViewPager.OnPageChangeListener リスナーを使用しました。これが私がしたことです:

スライド フラグメントを保持するアクティビティ内:

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.signature_wizard_activity);

    // Instantiate a ViewPager and a PagerAdapter.
    mPager = (ViewPager) findViewById(R.id.pager);
    mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager());
    mPager.setAdapter(mPagerAdapter);
    mPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            onSlideChanged(position); // change color of the dots
        }
        @Override
        public void onPageSelected(int position) {}
        @Override
        public void onPageScrollStateChanged(int state) {}
    });
}

onPageScrolled() は、スライドが表示されるたびに呼び出され、表示されているスライドの現在の位置をパラメーターとして取得します。良い点は、スライドが変更されたときだけでなく、最初に表示されたときも含めて呼び出されることです。

いつ使用できますか? たとえば、ViewPager でいくつかのヒントを使用してフラグメントをスライドさせるウィザード アクティビティがある場合、スライダーの下に合計スライド数を表す灰色のドットが付いたバーが必要になる可能性があります。ドットの 1 つが異なります。現在のスライドを表す色。この場合、ViewPager.OnPageChangeListener とメソッド onPageScrolled() が最適なオプションになります。

または、ボタン PREV がある場合。スライドを変更し、PREVを無効にしたいNEXT。最初のスライドのボタンを無効にし、最後のスライドの NEXT ボタンを無効にします。onPageScrolled() メソッド内で行う方法は次のとおりです。

 @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            if(position == 0){
                prevBtn.setTextColor(ContextCompat.getColor(SignatureWizardActivity.this, R.color.main_grey_500));
                prevBtn.setEnabled(false);
            }else{
                prevBtn.setTextColor(ContextCompat.getColor(SignatureWizardActivity.this, R.color.main_blue));
                prevBtn.setEnabled(true);
            }

            if(position == NUM_PAGES -1){
                nextBtn.setTextColor(ContextCompat.getColor(SignatureWizardActivity.this, R.color.main_grey_500));
                nextBtn.setEnabled(false);
            }else{
                nextBtn.setTextColor(ContextCompat.getColor(SignatureWizardActivity.this, R.color.main_blue));
                nextBtn.setEnabled(true);
            }
        }

ここで、NUM_PAGES はスライドの総数を表す定数です

于 2016-09-08T10:22:11.717 に答える
1

私の問題は、 getItem() メソッドが初めて2回呼び出されることです

これは問題ではありませんdefault feature of FragmentPagerAdapter。このページから次のページ、前のページにスワイプすると便利です。

エミュレーターに表示されるビューは 0 番目のインデックスですが、FragmentActivity で 1 番目のインデックス値を取得しました

同じ問題が発生しましたが、その理由はわかっています。これはあなたのためですused same Fragment in View Pager

これを修正する方法はseparate Fragments by using different Fragment.

于 2014-04-21T02:06:59.287 に答える