Есть FragmentActivity, к которому прицеплено несколько Fragment через TabsPagerAdapter. В первом фрагменте создал контейнер, чтобы при включении CheckBox на втором фрагменте, в него выводился дополнительный фрагмент. Обработку события OnCheckedChangeListener() произвожу в том же фрагменте где и сам CheckBox. При попытке нажать на CheckBox вываливается ошибка: he specified child already has a parent. You must call removeView() on the child's parent first.
MainActivity:
public class MainActivity extends FragmentActivity implements ActionBar.TabListener {
private ViewPager viewPager;
private TabsPagerAdapter mAdapter;
private ActionBar actionBar;
// Tab titles
private String[] tabs = { "Расчет КВ", "Регулярность движения", "Логи", "Настройки" };
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Initilization
viewPager = (ViewPager) findViewById(R.id.pager);
actionBar = getActionBar();
mAdapter = new TabsPagerAdapter(getSupportFragmentManager());
viewPager.setOffscreenPageLimit(3);
viewPager.setAdapter(mAdapter);
actionBar.setHomeButtonEnabled(false);
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
// Adding Tabs
for (String tab_name : tabs) {
actionBar.addTab(actionBar.newTab().setText(tab_name)
.setTabListener(this));
}
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageSelected(int position) {
// on changing the page
// make respected tab selected
actionBar.setSelectedNavigationItem(position);
}
});
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
// on tab selected
// show respected fragment view
viewPager.setCurrentItem(tab.getPosition());
}
}
Fragment1_layout
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/relativeLayout">
<LinearLayout
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
<b>android:id="@+id/container"</b>
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true">
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="@string/RealTime"
android:id="@+id/KVRealTime_tv"
android:textSize="60dp"
android:textStyle="bold"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true" />
</RelativeLayout>
Fragment2
public class Options extends Fragment implements CompoundButton.OnCheckedChangeListener {
CheckBox EmuEnable;
private FragmentManager manager;
private FragmentTransaction transaction;
private FakeSpeed fakespeed;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
manager = getActivity().getFragmentManager();
fakespeed = new FakeSpeed();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View v = inflater.inflate(R.layout.fragment_options, container, false);
EmuEnable = (CheckBox) v.findViewById(R.id.EmuEnable);
EmuEnable.setOnCheckedChangeListener(this);
//EmuEnable.setOnCheckedChangeListener(this);
return v;
}
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
transaction = manager.beginTransaction();
if (EmuEnable.isChecked()){
transaction.add(R.id.container, fakespeed);
}
transaction.commit();
}
}
Ну и код третьего фрагмента, который пытаюсь динамически прицепить к первому: (Код layuot файла прикладывать не буду, там просто несколько кнопок)
public class FakeSpeed extends Fragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View v = inflater.inflate(R.layout.fragment_fake_speed, container, true);
return v;
}