3

私はAndroidの開発に不慣れであり、ここで助けていただければ幸いです。

TextViewを含むフラグメントを使用しており、同じMyFragmentクラスの5つのインスタンスを使用しています。

アクティビティでは、ボタンとViewPagerを取得しました。ボタンがクリックされるたびに、すべてのフラグメントインスタンスのコンテンツを更新するためのボタンが必要です。

これがアクティビティです

public class MainActivity extends FragmentActivity {

final static String[] CONTENT = {"a", "b"};
ViewPager pager;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    List<MyFragment> fragments = new Vector<MyFragment>();
    for(int i = 0; i < 5; i++){
        MyFragment fragment = new MyFragment(CONTENT);
        fragments.add(fragment);
    }
    PagerAdapter adapter = new PagerAdapter(this.getSupportFragmentManager(), fragments);
    pager = (ViewPager) findViewById(R.id.viewpager);
    pager.setAdapter(adapter);

    Button button = (Button) findViewById(R.id.button);
    button.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            //method that isn't working
            PagerAdapter adapter = (PagerAdapter)pager.getAdapter();
            for(int i = 0; i < 5; i++){
                MyFragment fragment = (MyFragment) adapter.getItem(i);
                fragment.textView.setText(fragment.content[1]);
            }
        }
    });
}
}

フラグメント

public class MyFragment extends Fragment{

String[] content;
    TextView textView;

public MyFragment(String[] content) {
    this.content = content;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_content, container, false);
    textView = (TextView) view.findViewById(R.id.textView1);
    textView.setText(content[0]);
    return view;
}

}

そしてFragmentPagerAdapter

public class PagerAdapter extends FragmentPagerAdapter{

List<MyFragment> fragments;

public PagerAdapter(FragmentManager fm, List<MyFragment> fragments) {
    super(fm);
    this.fragments = fragments;
}

@Override
public Fragment getItem(int arg0) {
    return fragments.get(arg0);
}

@Override
public int getCount() {
    return fragments.size();
}

}

OnClickメソッドは、adapter.getCurrentItem()-1未満、またはadapter.getCurrentItem()+ 1より大きいアダプターからフラグメントにアクセスしようとすると、NullPointerExceptionが発生します。

すべてのフラグメントを同時に更新する方法について何かアイデアはありますか?

前もって感謝します。

4

1 に答える 1

2

これらのフラグメントを更新する最も簡単な方法は、コードを使用しViewPagerて、メモリに保持されるフラグメントの数をフラグメントの総数-1に設定することです(したがって、すべてのフラグメントは、どのページにいても有効です)。あなたの場合:

pager.setOffscreenPageLimit(4); // you have 5 elements

私のコメントのメソッドをメソッドと一緒に使用してonPageScrollStateChanged(ユーザーがスワイプを開始した瞬間に更新が開始されるように)、ユーザーがポケットベルをスワイプし始め、現在表示されているフラグメントの左右にフラグメントを更新するタイミングを確認できます。 、しかしこれを正しく行うのは少し難しいので、最初のオプションを選択することをお勧めします。

フラグメントを含むコードに関するいくつかのポイント:

フラグメントクラスをネストする場合は、それを静的にして、アクティビティオブジェクトに関連付けないようにします。Fragmentデフォルト以外のコンストラクターを作成しないでください。フレームワークがフラグメントを再作成する必要がある場合は、デフォルトのコンストラクターを呼び出し、使用できない場合は例外をスローします。たとえば、電話/エミュレーターの向きを変更して、何が起こるかを確認してみてください(これは、Androidがフラグメントを再作成する場合の1つです)。最後に、ViewPagerのアダプタにカスタム名を使用しますPagerAdapter。これはのスーパークラスの名前であり、FragmentViewPagerコードを読んでいる人にとっては非常に混乱します。

にデータを渡す必要がある場合は、Fragment次のような作成方法を使用できます。

public static MyFragment newInstance(String text) {
        MyFragment f = new MyFragment();
        Bundle b = new Bundle();
        b.putString("content", text);
        f.setArguments(b);
        return f;
    }

テキストは、を使用しMyFragmentて利用できるようになりますgetArguments().getString("content");

于 2012-09-10T14:33:15.533 に答える