3

ViewPagerを使用してフラグメントのセットを表示するフラグメントアクティビティがあります。フラグメントアクティビティには、クリックすると現在のフラグメントにメッセージを送信してコンテンツを更新するボタンがあります。フラグメントのビューを更新できないという事実を除いて、すべてが正常に機能します(アクティビティ/現在のフラグメント通信)。getView()による現在のビューへのアクセスは、この関数がnullを返すため機能しません。フラグメントが作成された後(ViewCreatedが呼び出された後)、getViewが破棄されるようです。ここで何かが足りませんか?フラグメントにそのコンテンツをプログラムで再描画させるにはどうすればよいですか?これが機能する唯一の方法は、フラグメントが親アクティビティから作成される場合のようです。これを行うには、フラグメントを削除して再度追加する必要がありますか?

コードは次のとおりです。

主な活動:

public class MainActivity extends FragmentActivity {

    private MyAdapter mAdapter;
    private static ViewPager mPager;

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                setupViewPager();
        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
                getMenuInflater().inflate(R.menu.activity_main, menu);
                return true;
        }

        @Override
        public boolean onPrepareOptionsMenu(Menu menu) {
                return super.onPrepareOptionsMenu(menu);
        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
                switch (item.getItemId()) {

                case R.id.menu_test:
                        updateFragment();
                        return true;

                default: return true;
                }
        }

        private void updateFragment() {
                for (int i=0; i< mAdapter.getCount(); i++) {
                        SampleFragment fragment = (SampleFragment) mAdapter.getItem(i);
                        fragment.update();
                }
        }

        private void setupViewPager() {
                try {
                        mAdapter = new MyAdapter(getSupportFragmentManager());

                        mPager = (ViewPager) findViewById(R.id.pager);
                        mPager.setAdapter(this.mAdapter);

                } catch (Exception e) {
                        e.printStackTrace();
                }
        }

        public class MyAdapter extends FragmentPagerAdapter {

                public MyAdapter(FragmentManager fm) {
                        super(fm);
                }

                @Override
                public Fragment getItem(int position) {
                        SampleFragment fragment = new SampleFragment(position); 
                        return fragment;
                }

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

およびフラグメントクラス:

public class SampleFragment extends Fragment{

        private int myPosition = -1;

        public SampleFragment(int position) {
                this.myPosition = position;
        }

        @Override
        public void onAttach(Activity activity) {
                super.onAttach(activity);
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
                View view = inflater.inflate(R.layout.fragment, container, false);
                update(view, "Updated from onCreateView");
                return view;
        }

        @Override
        public void onActivityCreated(Bundle bundle) {
                super.onActivityCreated(bundle);
        }

        @Override
        public void onViewCreated(View view, Bundle savedInstanceState) {
                super.onViewCreated(view, savedInstanceState);

                view.findViewById(R.id.textTitle).setOnClickListener(myClickListener);
        }

        private OnClickListener myClickListener = new OnClickListener() {
                @Override
                public void onClick(View v) {
                        switch (v.getId()) {

                        case R.id.textTitle:
                                break;

                        }
                }
        };

        public void update() {
                update(getView(), "Updated from main");
        }

        private void update(View view, String subtitleText) {
                TextView title = (TextView) view.findViewById(R.id.textTitle);
                TextView subtitle = (TextView) view.findViewById(R.id.textSubtitle);

                title.setText("Fragment " + myPosition);
                subtitle.setText(subtitleText);
        }
}

メインアクティビティのメニュー項目から呼び出されると、view.FindViewById(ビューはnull)でエラーが発生します。

4

1 に答える 1

4

ViewPager でフラグメントへの参照を保持する方法を説明するこの記事をご覧ください

ページに記載されている 2 つの方法があります。1 つ目は、FragmentManager を使用してフラグメントを追加するときにタグを設定することです。次に、を使用してフラグメントを取得できますfindFragmentByTag()。ただし、FragmentPagerAdapter または FragmentStatePagerAdapter を使用してこれを機能させる方法はわかりませんでした。これらの実装はフラグメントを追加するからです。独自のカスタム PagerAdapter を使用している場合は、これでうまくいく可能性があります。

FragmentPagerAdapter または FragmentStatePagerAdapter で機能するもう 1 つの方法では、すべてのフラグメントのマップを保持し、getItem()実装内で更新しますdestroyItem()。この方法は私にとってはうまくいきました。

現在のフラグメントへの参照を取得したら、フラグメント内のメソッドを呼び出すだけでビューを更新できます。

于 2012-09-28T00:28:12.893 に答える