3

我試圖創建一個自定義的ListView。當我測試的代碼,我收到以下錯誤沒有發現在Android的FragmentActivity ID與ListFragment

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} 

我有參考之前發佈,除了這個問題閱讀片段,ListFragments和列表視圖Android的文檔以下鏈接。

鏈接1:FragmentActivity onCreateView
鏈路2: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?

我有類TeamActivity,它擴展了FragmentActivity和Te amListFragment,它擴展了ListFragment並實現LoaderManager.LoaderCallbacks。下面請看代碼:

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> 
+1

什麼東西有此ID 0x7f08000c?你可以在你的gen/ /R.java文件中找到這個答案。 – Hartok 2013-03-10 02:32:48

+0

@ Hartok:它在佈局xml調用team_row.xml中引用,它具有TextView和等於text1的android id。 0x7f08000c = text1。 – dionysus 2013-03-10 02:36:33

+0

@Hartok:再次感謝您的幫助。然而,我把被引用的id放在我的team.xml文件中,現在我收到以下內容了:java.lang.IllegalArgumentException:沒有爲id 0x7f08000c查找片段TeamListFragment {4065f128#0 id = 0x7f08000c} – dionysus 2013-03-10 03:32:58

回答

5

在你活動onCreate()方法使用的方法setContentView(R.layout.activity)也定義佈局文件,其中包含一個FrameLayoutLinearLayout

現在調用add()的FrameLayout您剛纔添加的,而不是R.id.android_teamList的id您正在使用您的onCreate(),並與您的team.xml佈局文件android:id="@android:id/list"替換android:id="@+id/android:teamList"

順便說一句,如果您必須,您可以訪問您的ListViewandroid.R.id.list

+0

感謝您的幫助。但是,我如何在fragmentTransaction.add(R.id.listView1,teamListFragment)中檢索這個; ? – dionysus 2013-03-10 02:31:45

+1

等一下......別的東西也是錯的......更新我的答案。 – 2013-03-10 02:34:57

+0

爲什麼我需要創建另一個佈局文件?不應該team.xml佈局文件是足夠的? – dionysus 2013-03-10 03:34:53

1

R.id.text1應在R.layout.team中定義。

檢查SimpleCursorAdapter doc:定義此 列表項意見的佈局文件的

資源標識符。佈局文件至少應包括那些命名視圖 定義「到」

+0

感謝您的幫助。但是由於Compatibility Library v4中的一個錯誤,還有一個額外的部分可以使所有這些工作起作用。ListFragment使用內部id作爲'空'TextView。請參閱[兼容性錯誤](https://code.google.com/p/android/issues/detail?id=21742)和[解決方案](http://stackoverflow.com/questions/10608624/list-fragment-does -not-accept-my-layout)以獲取更多信息。 – dionysus 2013-03-13 05:06:10

相關問題