Я пытаюсь сделать свое приложение более удобным для планшетов, и поэтому я пытаюсь выучить фрагменты.Я хочу типичный двухпанельный макет, где левая сторона - это «навигация», и вы нажимаете на один из элементов, и он изменяет фрагмент справа.
Я могу продублировать учебники, которые используютListFragment слева, и если вы щелкнете по одному из них, он обновит фрагмент «детали» справа.
Я старался изо всех сил, чтобы дублировать этот код, и просто использовать LinearLayoutс кнопками с левой стороны, чтобы при нажатии кнопки загружался соответствующий фрагмент справа, но он не работал.Когда я фиксирую FragmentTransaction, я получаю java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
Что такое родительский дочерний элемент и почему я должен вызвать на нем removeView?
Я пытаюсь загрузить фрагмент в FrameLayout, но ятакже просто попытался заменить другой фрагмент в макете, и все равно получаю ошибку.
В идеале я хочу, чтобы левый фрагмент занимал весь экран, пока не будет нажата кнопка, требующая ввода фрагмента слева, но я полагаю, одна проблема за раз.
Код
Основная активность
public class FragmentExample2Activity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
SelectorFragment (левая сторона)
public class SelectorFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
View fragment = inflater.inflate(R.layout.selector, container);
Button button1 = (Button) fragment.findViewById(R.id.button1);
button1.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
getFragmentManager().beginTransaction().replace(R.id.detail_holder, new DetailsFragment(), "stuff").commit();
}
});
return fragment;
}
}
DetailsFragment
public class DetailsFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
return inflater.inflate(R.layout.details, container);
}
}
main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<fragment class="com.coreno.testfragment.SelectorFragment"
android:id="@+id/select"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
/>
<fragment class="com.coreno.testfragment.DetailsFragment"
android:id="@+id/detail_holder"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="2"
/>
<!--
<FrameLayout
android:id="@+id/detail_holder"
android:layout_width="0px"
android:layout_height="match_parent"
android:layout_weight="2"
/>
-->
</LinearLayout>