Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 以编程方式添加的片段';如何创建视图?_Java_Android_Android Fragments - Fatal编程技术网

Java 以编程方式添加的片段';如何创建视图?

Java 以编程方式添加的片段';如何创建视图?,java,android,android-fragments,Java,Android,Android Fragments,我有一个FragmentActivity,我使用FragmentTrasaction添加了一个ListFragment。一切都很好,但我在尝试设置ListFragment中的ListView的onItemClickListener时遇到了“未创建内容视图”错误,如下所示: public class ContactList extends FragmentActivity implements LoaderManager.LoaderCallbacks<Cursor>, OnI

我有一个
FragmentActivity
,我使用
FragmentTrasaction
添加了一个
ListFragment
。一切都很好,但我在尝试设置
ListFragment
中的
ListView
onItemClickListener
时遇到了“未创建内容视图”错误,如下所示:

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);
}
不幸的是,这仍然会导致“内容视图尚未创建”错误。我不明白这一点-在调用
super.onCreateView
之后,所有视图现在都应该创建了吗

通过将
inItemClickListener
放在“onResume()”上,我终于让它工作了,但我不知道为什么它在
onCreateView
中不工作

谁能启发我


谢谢。

创建了一个视图,因此它在返回后立即可用,而不是在执行之前或执行期间。

ft.commit
之后只需调用
getSupportFragmentManager().executePendingTransactions()()

这将强制系统立即执行默认情况下仅计划执行的
ft.commit


在此之后,您的ListView应该准备好被访问,以定义
OnClickListener
(在您的
FragmentActivity
中)

Fragment
有自己的生命周期,并且我记得您不能在包含
FragmentActivity
的生命周期中设置默认
Fragment
事件的侦听器(或任何其他
活动
)。 因此,如果使用默认的
ListFragment
,则无法确定列表视图是否已经创建

我终于让inItemClickListener开始工作了 “onResume()”,但我不知道为什么它在onCreateView中不起作用

这可能对您有效,但也不安全,因为它不知道片段的生命周期状态

这里的默认/最佳实践如下:编写自己的片段类,让它扩展
ListFragment
,并将onClick逻辑放入片段的方法中

背景:

在片段的UI事件上设置任何侦听器都应该发生在片段本身内部,而不是在包含片段的活动中。这就是引入片段的原因之一:提供大部分独立的组件(具有自己的生命周期)否则,您可以只使用
ListActivity

是-但我在设置onClickListener之前调用super.onCreateView,因此视图应该在该点创建,是吗?FragmentActivity中没有onActivityCreated,这是一个片段方法。是的,您在本地v变量中有它,但在getLi中没有stView()无法访问它,因为它尚未返回。@KernowBunney,我的错,我只是从文档中未经检查就获取了它。您必须坚持使用onResume,然后将侦听器移动到fragment。@chucky谢谢-听起来这会起作用,但saschoar上面的回答突出了我对ListFragment具有单独lif的基本疏忽我猜也不能100%保证视图是在调用executePendingTransactions后创建的……根据文档,是的,但我不能确定!我很高兴你找到了你要搜索的内容,即使saschoar的答案最适合你,如果其他人遇到simi,你也可以投票支持我的帖子lar与您一样存在问题。抱歉-这不起作用:我仍然收到一个“未创建内容视图”错误。我想,尽管调用
executePendingTransactions
,已强制“立即”添加片段,但ListFragment的生命周期(是独立的)没有达到夸大视图的程度。好吧,这很奇怪……我几周前尝试过,它没有任何问题。遗憾的是,我从我的记忆中重新创建了它,因为我不再有那个代码片段了……谢谢——这是有道理的。我忘记了独立生命周期的问题。
@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;
}