0

を使用しFragmentActivityてシングルを追加する があります。すべて問題ありませんが、次のようにのを設定しようとすると、「コンテンツ ビューが作成されていません」というエラーが発生し ました。ListFragmentFragmentTrasactiononItemClickListenerListViewListFragment

public class ContactList extends FragmentActivity implements
    LoaderManager.LoaderCallbacks<Cursor>, OnItemClickListener {

static private final String TAG = ContactList.class.getSimpleName();

private SimpleCursorAdapter mListAdapter;
ListFragment mListFrag;

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

     mListFrag = new ListFragment();


    if (savedInstanceState == null) {
        // add list view fragment
        FragmentTransaction ft = getSupportFragmentManager()
                .beginTransaction();
        ft.add(android.R.id.content, mListFrag);
        ft.commit();
    }

    // set up list view adapter:
    mListAdapter = new SimpleCursorAdapter(this,
            android.R.layout.simple_list_item_1, null,
            new String[] { ContactsContract.Contacts.DISPLAY_NAME },
            new int[] { android.R.id.text1 },
            SimpleCursorAdapter.NO_SELECTION);

    // (we will switch in the cursor later)
    mListFrag.setListAdapter(mListAdapter);

    // set list view click listener:
    // (THIS LINE, I KNOW NOW, CAUSES PROBLEMS - SO I MOVED IT
    //  TO onCreateView):
    //mListFrag.getListView().setOnItemClickListener(this);

    // initial cursor loader:
    getSupportLoaderManager().initLoader(0, null, this);
}

メソッドを呼び出そうとしているので、まだ表示されていないことにすぐに気付きましgetListViewた。だから、私はラインラインをに移動しました:onCreateListViewsetOnItemClickListeneronCreateView

@Override
public View onCreateView(String name, Context context, AttributeSet attrs) {
    View v = super.onCreateView(name, context, attrs);

    // set list view click listener:
    mListFrag.getListView().setOnItemClickListener(this); // this still crashes

    return v;
}

残念ながら、これはまだ「コンテンツ ビューが作成されていません」というエラーでクラッシュします。私はこれを理解していません - 確かに、super.onCreateViewすべてのビューを呼び出した後、作成されたはずですか?

inItemClickListener「onResume()」に入れることでようやく動作するようになりましたが、なぜ動作しなかったのかわかりませんonCreateView

誰でも私を啓発できますか?

ありがとう。

4

3 に答える 3

2

Fragmentには独自のライフサイクルがあり、思い出したように、含まれている(またはその他の)Fragment内からデフォルトのライフサイクル イベントにリスナーを設定することはできません。したがって、既定の を使用すると、リスト ビューが既に作成されているかどうかを確認できません。FragmentActivityActivityListFragment

「onResume()」に置くことで最終的にinItemClickListenerが機能するようになりましたが、onCreateViewで機能しなかった理由がわかりません。

これはうまくいくかもしれませんが、フラグメントのライフサイクル状態を認識していないため、安全ではありません。

ここでのデフォルト/ベスト プラクティスは次のとおりです。独自の Fragment クラスを作成し、それを拡張して、フラグメントのメソッドにListFragmentonClick ロジックを配置します。onListItemClick()

背景:
Fragment の UI イベントでのリスナーの設定は、Fragment を含む Activity ではなく、Fragment 自体の内部で行う必要があります。Fragments が導入された理由の 1 つは、組み合わせて再利用できるほとんど独立したコンポーネント (独自のライフサイクルを持つ) を提供することです。それ以外の場合は、ListActivity.

于 2013-04-07T17:51:11.053 に答える
0

OnCreateViewはビューを作成するため、ビューが返された直後に使用できますが、実行前または実行中には使用できません。

于 2013-04-07T16:34:50.010 に答える