1

私は2つのフラグメントを持っています。インターフェイスを使用して、あるフラグメントを別のフラグメントと通信しています。

public class FragmentLanguages extends ListFragment {
LanguageArrayAdapter adapter;
OnLanguageChangedListener mCallback;

public interface OnLanguageChangedListener {
    public void onLanguageSelected(int position);
}

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

    View view = inflater.inflate(R.layout.languages, null);

    return view;
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    Language languages[] = new Language[] {
            new Language(R.drawable.ic_flag_german, "German"),
            new Language(R.drawable.ic_flag_spanish, "Spanish"),
            new Language(R.drawable.ic_flag_russian, "Russian"),
            new Language(R.drawable.ic_flag_ukrainian, "Ukrainian") };

    adapter = new LanguageArrayAdapter(getActivity(), R.layout.list_row,
            languages);
    getListView().setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            adapter.setSelectedItem(position);
            mCallback.onLanguageSelected(position + 1);
        }
    });
    setListAdapter(adapter);
}

public static class Language {
    public int image;
    public String text;

    public Language() {
        super();
    }

    public Language(int image, String text) {
        super();
        this.image = image;
        this.text = text;
    }
}

public void setOnLanguageChangedListener(OnLanguageChangedListener mCallback) {
    this.mCallback = mCallback;
}

}

そしてもう一つ

public class FragmentCircles extends Fragment implements OnClickListener,
    OnLanguageChangedListener { ...
.....
    @Override
public void onLanguageSelected(int position) {
    currentLang = position;
    translationCircle.removeAllViews();
    String strSelect = "SELECT Translation FROM Translation WHERE Lang_Id="
            + currentLang + " ORDER BY Word_Id ASC";
    translationList = DataBaseHelper.getInstance(getActivity())
            .SelectTranslationList(strSelect);
    Log.i("Lang ", "changed " + currentLang);


    calculateCentreTranslation(lLabelRadius, width, height);
}

しかし、ListFragment でアイテムを選択すると画面が回転した後、エラーが発生します

12-07 19:06:15.163: E/AndroidRuntime(436): java.lang.NullPointerException

行で

                mCallback.onLanguageSelected(position + 1);

mCallback が null のようです。しかし、どうすれば修正できますか?

4

3 に答える 3

1

他のフラグメントに通知FragmentLanguagesする必要があることを通知する必要がありますFragmentActivityNullPointerExceptionsこれにより、一方がインスタンス化されていない場合に他方が通知したときにトリガーされる可能性のあるフラグメントがリンクされないようになります。

だからあなたのインターフェースOnLanguageChangedListenerはあなたの中にとどまりますLanguagesFragment

実装するFragmentActivity 必要がありますsetOnLanguageChangedListener

FragmentLanguages

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

いつでもフラグメントで使用できるようにonAttach()なる前でも呼び出されるため、次のようになります。onCreate()

onLanguageChangedListener.onLanguageChanged(...);

あなたのFragmentActivitywhich 実装では、これOnLanguageChangedListenerをオーバーライドする必要があります:

@Override
public void onLanguageChanged(...) {
    // here you implement the logic to notify other fragments
}
于 2012-12-07T19:35:52.450 に答える
0

mCallBack Listener は宣言されるだけで、インスタンス化されることはありません。onAttach() メソッドでコンテナー アクティビティを使用して mCallBack リスナーをインスタンス化する必要があります。方法については、こちらをご覧ください。 http://developer.android.com/training/basics/fragments/communicating.html#DefineInterface

于 2012-12-07T22:16:40.757 に答える
0

Android では、縦向きから横向きに、またはその逆に切り替えると、アクティビティが再作成されるため、一部のデータを保持したい場合は、Bundle saveInstanceState でこれらを管理する必要があります。

于 2012-12-07T19:27:10.217 に答える