【问题标题】:No View Found For id in Android FragmentActivity with ListFragment使用 ListFragment 在 Android FragmentActivity 中找不到 id 的视图
【发布时间】:2013-03-10 02:22:43
【问题描述】:

我正在尝试创建自定义 ListView。当我测试我的代码时,我收到以下错误

03-09 19:21:10.425: E/AndroidRuntime(379): java.lang.RuntimeException: Unable to start      activity ComponentInfo{com.anomaly.punchlist/com.anomaly.punchlist.TeamActivity}: java.lang.IllegalArgumentException: No view found for id 0x7f08000c for fragment TeamListFragment{4067a358 #0 id=0x7f08000c}

除了阅读有关 Fragments、ListFragments 和 ListViews 的 Android 文档之外,我在发布此问题之前还参考了以下链接。

链接 1:FragmentActivity onCreateView
链接二:Problem using ListFragment on Android
链接3:Android Fragment no view found for ID?
链接4:Android ListFragment is to confusing
链接5:How update ListView in ListFragment from FragmentActivity?
链接6:Populate ListFragments with a custom view?

我有扩展 FragmentActivity 的 TeamActivity 类和扩展 ListFragment 并实现 LoaderManager.LoaderCallbacks 的 TeamListFragment。请看下面的代码:

TeamActivity.java

package com.anomaly.punchlist;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;

public class TeamActivity extends FragmentActivity {

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

    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction =  fragmentManager.beginTransaction();
    TeamListFragment teamListFragment = new TeamListFragment();
    fragmentTransaction.add(R.id.android_teamList, teamListFragment);
    fragmentTransaction.commit();       
   }

 }

TeamListFragment.java

package com.anomaly.punchlist;

    import android.database.Cursor;
    import android.os.Bundle;
    import android.support.v4.app.ListFragment;
    import android.support.v4.app.LoaderManager;
    import android.support.v4.content.CursorLoader;
    import android.support.v4.content.Loader;
import android.support.v4.widget.CursorAdapter;
import android.support.v4.widget.SimpleCursorAdapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;

import com.anomaly.punchlist.contentprovider.basecolumns.TeamBaseColumns.Team;
import com.j256.ormlite.logger.Logger;
import com.j256.ormlite.logger.LoggerFactory;

public class TeamListFragment extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor> {

    private static Logger logger = LoggerFactory.getLogger(TeamListFragment.class);
    private ListView listView;
    private SimpleCursorAdapter adapter;
    private static final int TEAM_LOADER_ACTIVITY = 0x01;
    private static final String[] PROJECTION = new String[] { "project_manager_id", "contact_id", "project_id" };
    private static String SELECTION = "contact_id = ? AND project_id = ?";

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

    @Override
    public void onCreate(Bundle savedInstanceState) {
        try {
            super.onCreate(savedInstanceState);
            int[] uiBindTo = { R.id.text1 };
            getLoaderManager().initLoader(TEAM_LOADER_ACTIVITY, null, this);
            adapter = new SimpleCursorAdapter(getActivity().getApplicationContext(), R.layout.team, null, null, uiBindTo, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);

        } catch (Exception e) {
            logger.error(e.getMessage());
            new RuntimeException("RuntimeException occurred in onCreate() method of TeamActivity." + e);
        }
    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
    }

    @Override
    public Loader<Cursor> onCreateLoader(int arg0, Bundle bundle) {

        String contactId = new String();
        String projectId = new String();
        CursorLoader cursorLoader = null;

        if (bundle != null) {
            contactId = bundle.getString("contact_id");
            projectId = bundle.getString("project_id");

        }
        String[] selectionArgs = { contactId + ", " + projectId };
        cursorLoader = new CursorLoader(getActivity(), Team.CONTENT_URI, PROJECTION, SELECTION, null, null);
        return cursorLoader;
    }

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
        adapter.swapCursor(cursor);
        setListShown(true);

    }

    @Override
    public void onLoaderReset(Loader<Cursor> cursor) {
        adapter.swapCursor(null);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        onCreate(savedInstanceState);
        View teamView = inflater.inflate(R.layout.team, container, false);
        return teamView;
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        listView = getListView();
        listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
        setListAdapter(adapter);
        setListShown(true);
    }

}

除了上面的代码,我还有以下自定义布局。

team.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingLeft="8dp"
    android:paddingRight="8dp" >


    <ListView
        android:id="@+id/android:teamList"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:background="@color/grey2"
        android:divider="@color/blue2"
        android:dividerHeight="1dp"
        android:drawSelectorOnTop="false" />

    <TextView
        android:id="@id/android:empty"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#FF0000"
        android:text="No data" />
</LinearLayout>

【问题讨论】:

  • 这个 id 0x7f08000c 是什么?你可以在你的 gen//R.java 文件中找到这个答案。
  • @Hartok:它在布局 xml 调用 team_row.xml 中被引用,它有一个 TextView 和一个等于 text1 的 android id。 0x7f08000c = text1.
  • @Hartok:再次感谢您的帮助。但是,我将引用的 id 放在我的 team.xml 文件中,现在我收到以下原因:java.lang.IllegalArgumentException: No view found for id 0x7f08000c for fragment TeamListFragment{4065f128 #0 id=0x7f08000c}
  • @Hartok BTW 引用的 id 是 team.xml 文件中的 TextView。
  • 你不应该修改 R.java

标签: android android-listview android-fragments android-listfragment android-fragmentactivity


【解决方案1】:

在您的ActivityonCreate() 方法中使用setContentView(R.layout.activity) 方法并定义一个布局文件,其中包含LinearLayout 内的FrameLayout

现在使用您刚刚添加的 FrameLayout 的 id 调用 add() 方法,而不是您在 onCreate() 中使用的 R.id.android_teamList 并在您的 android:id="@+id/android:teamList" 中替换 android:id="@+id/android:teamList" team.xml 布局文件。

顺便说一句,如果您必须这样做,您可以使用android.R.id.list 访问您的ListView

【讨论】:

  • 感谢您的帮助。但是,如何在 fragmentTransaction.add(R.id.listView1, teamListFragment); 中检索它?
  • 等一下...还有其他问题...更新我的答案。
  • 为什么我需要创建另一个布局文件? team.xml 布局文件不应该够用吗?
  • 这是我阅读过的文档ListFragmentsFragments。你读过哪些我没有读过的文件?请提供。
  • 请阅读developer.android.com/guide/components/fragments.html#Example关注fragment_layout.xml,看看我们如何需要FrameLayoutFragments动态放置在Activity中,然后你只需调用ft.replace(R.id.details, details);跨度>
【解决方案2】:

R.id.text1 应该在R.layout.team 中定义。

查看SimpleCursorAdapter doc

定义视图的布局文件的资源标识符 项目清单。布局文件应至少包含那些命名视图 在“to”中定义

【讨论】:

  • 感谢所有帮助。但是由于兼容性库 v4 ListFragment 中的一个错误,让所有这些工作都需要额外的部分,它使用“空”TextView 的内部 id。请参阅Compatibility BugSolution 了解更多信息。
猜你喜欢
  • 2011-11-22
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多