私は一日中これに行き詰まっていましたが、ここで自分の状況に十分に近い答えを見つけることができないようです。
これが私のUIです。タブとリストビューはうまく機能しています:https://i.stack.imgur.com/84kRY.png
ブルーのようなリスト項目をクリックすると、ポートレートで新しいフラグメントがブルースクリーンで表示され、ランドスケープではそのフラグメントが画面の半分に表示され、リストビューがもう一方に表示されます。これを実現するために、ActionBarSherlock とフラグメントを使用しています。
徹底的に構築したので、最初は 1 つのリストから始めましたが、思いどおりに機能しました。次に、タブ、ページャー機能、およびその他のリストを追加しました。そのプロセスのどこかでフラグメントの表示が機能しなくなり、何かをクリックするたびにクラッシュします。
これが私のListViewアクティビティの1つのクリック部分です
public class TitlesFragment extends SherlockListFragment{
boolean mDualPane;
int mCurCheckPosition = 0;
.
.
.
@Override
public void onSaveInstanceState(Bundle outState){
super.onSaveInstanceState(outState);
outState.putInt("curChoice", mCurCheckPosition);
}
@Override
public void onListItemClick(ListView l, View v, int position, long id){
showDetails(position);
}
void showDetails(int position){
SherlockFragment newContent = new SherlockFragment();
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
if(mDualPane){
switch(position){
case 0:
newContent = new Blue();
break;
case 1:
newContent = new Red();
break;
case 2:
newContent = new Green();
break;
case 3:
newContent = new Yellow();
break;
case 4:
newContent = new Purple();
break;
} ft.replace(R.id.details, newContent);
} else {
switch(position){
case 0:
newContent = new Blue();
break;
case 1:
newContent = new Red();
break;
case 2:
newContent = new Green();
break;
case 3:
newContent = new Yellow();
break;
case 4:
newContent = new Purple();
break;
}ft.replace(R.id.titles, newContent);
}
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.addToBackStack(null);
ft.commit();
return;
}
}
ブルークラスはこちら
public class Blue extends SherlockFragment{
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
}
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
return inflater.inflate(R.layout.blue, container, false);
}
}
青のレイアウト
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/blue"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#0000FF"
android:orientation="vertical" >
</LinearLayout>
横向きに置き換えたいレイアウト
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:baselineAligned="false"
android:orientation="horizontal"
android:id="@+id/fragment_layout_support_land" >
<fragment
android:id="@+id/titles_land"
android:layout_width="0px"
android:layout_height="match_parent"
android:layout_weight="1"
class="***.TitlesFragment" />
<fragment
android:id="@+id/details"
android:layout_width="0px"
android:layout_height="match_parent"
android:layout_weight="2" />
</LinearLayout>
そして、縦向きに置き換えるレイアウト
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_layout_support"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<fragment
android:id="@+id/titles"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="***.TitlesFragment" />
</FrameLayout>
そして最後に私のLogCat
チュートリアルを使用して、以前に機能していたフラグメントを取得しました。これ以上リンクを投稿することはできませんが、ListFragment チュートリアル パート 2 という YouTube で見つけることができます。
現時点では、ゼロから始めることやコードを別の方法で実行することなど、何に対してもオープンですが、ここで何が起こっているのか、その理由をもっと理解したいと思っているので、そこから学ぶことができます。ありがとう!
編集 何か新しいことを試してみたところ、新しいエラーが発生しました
@Override
public void onListItemClick(ListView l, View v, int position, long id){
showDetails(position);
}
void showDetails(int position){
SherlockFragment newContent = new SherlockFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.add(R.id.fragment_layout_support, newContent);
transaction.commit();
if(mDualPane){
switch(position){
case 0:
newContent = new Blue();
break;
case 1:
newContent = new Red();
break;
case 2:
newContent = new Green();
break;
case 3:
newContent = new Yellow();
break;
case 4:
newContent = new Purple();
break;
} transaction.add(R.id.fragment_layout_support_land, newContent);
} else {
switch(position){
case 0:
newContent = new Blue();
break;
case 1:
newContent = new Red();
break;
case 2:
newContent = new Green();
break;
case 3:
newContent = new Yellow();
break;
case 4:
newContent = new Purple();
break;
}transaction.replace(R.id.fragment_layout_support, newContent);
}
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
transaction.addToBackStack(null);
transaction.commit();
return;
}
}
新しい LogCat
FATAL EXCEPTION: main java.lang.IllegalStateException: commit already called
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:582)
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:574)
at [package].TitlesFragment.showDetails(TitlesFragment.java:97)
at [package].TitlesFragment.onListItemClick(TitlesFragment.java:44)
at android.support.v4.app.ListFragment$2.onItemClick(ListFragment.java:58)
at android.widget.AdapterView.performItemClick(AdapterView.java:298)
at android.widget.AbsListView.performItemClick(AbsListView.java:1100)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:2788)
at android.widget.AbsListView$1.run(AbsListView.java:3463)
at android.os.Handler.handleCallback(Handler.java:730)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5103)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)