ここで図1のように単純なリスト/詳細ビューを実装しようとしていますが、「コンテンツにはid属性が「android.R.id.list」であるListViewが必要です」というランタイム例外が発生します。このエラーは、結果の量に問題がある場合は詳細に議論されているようですが、ほとんどの答えは ListActivity を拡張することに関するもののようですが、私は ListFragment を拡張しています。これまでのところ、私はそれを修正することに運がありませんでした。基本アクティビティは次のとおりです。
SpeciesListActivity.java
public class SpeciesListActivity extends MenuItemActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_species_list);
// Check if the species_detail view is available. If it is
// we're running both fragments together.
if (findViewById(R.id.species_detail) != null) {
}
}
}
フラグメントは、そのレイアウト ファイルを介して含まれています。
activity_species_list.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:baselineAligned="false"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment android:name="com.example.fragments.SpeciesListFragment"
android:id="@+id/species_list"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent" />
<fragment android:name="net.gamebreeder.fragments.SpeciesDetailFragment"
android:id="@+id/species_detail"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent" />
</LinearLayout>
これは 2 つのペインのレイアウトです。1 つのペインのレイアウトは、2 番目のフラグメント (id species_detail) が含まれていないことを除いて同じです。
問題のフラグメント:
SpeciesListFragment.java
public class SpeciesListFragment extends ListFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_species_list, container, false);
}
}
そしてフラグメントのレイアウト:
fragment_species_list.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="8dp"
android:paddingRight="8dp">
<ListView android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:drawSelectorOnTop="false"/>
<TextView android:id="@id/android:empty"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="@string/empty_string"/>
</LinearLayout>
ドキュメントによると、 onCreateView() をオーバーライドしないように SpeciesListFragment を変更して、強制的にデフォルトを使用しようとしました:
注: フラグメントが ListFragment のサブクラスである場合、デフォルトの実装では onCreateView() から ListView が返されるため、実装する必要はありません。
しかし、私はまだ得る:
java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list'
私が見つけた 1 つの質問は、メイン アクティビティで FragmentActivity を拡張していることを確認することを示唆しており、それがまさに MenuItemActivity です。
public class MenuItemActivity extends FragmentActivity {
これは基本的に単なるラッパーなので、すべてのアクティビティで手動でメニューを作成する必要はありません。
何か助けていただければ幸いです-単純なものが欠けていることを願っています。
編集 2013-06-27
fragment_species_list.xml の id を両方としてフォーマットしようとしました@id/android:list
が@android:id/list
、どちらも機能しません。ドキュメントには使用するように書かれています@id/android:list
が、私が読んだ他の質問は、両方が機能することを示唆しているようですが、両方でエラーが発生します。私も試してみまし@+id/list
た。
また、以下の回答に基づいて以下を変更しました。
activity_species_list.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:baselineAligned="false"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment class="com.example.fragments.SpeciesListFragment"
android:id="@+id/species_list"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent" />
<fragment class="net.gamebreeder.fragments.SpeciesDetailFragment"
android:id="@+id/species_detail"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent" />
</LinearLayout>