Android 1.6 & Fragment & Tabhost
Я работаю над обновлением приложения Android (совместимость с 1.6), который использует TabHost
для отображения 3 разных вкладок с вложенными действиями.
В то время, когда я использовал трюк ActivityGroup
для отображения вложенных действий на вкладке, но я очень недоволен этим методом, так как это настоящая боль для обработки некоторых функций.
Я слышал о пакете совместимости API Fragments для 1.6, а Fragment
отлично подходит для того, что я хочу сделать (показать вложенные представления/функции на вкладке с эффектами перехода и т.д.), но я не могу заставить его работать с a TabHost
(Он предназначался для работы с Action Bar
, но он не доступен в пакете совместимости).
Кто-нибудь из вас нашел способ создать такую структуру в ваших приложениях?
Моя ошибка здесь:
ERROR/AndroidRuntime(955): Caused by: java.lang.RuntimeException: Unable
чтобы начать работу ComponentInfo {com.XXX}: java.lang.IllegalArgumentException: Нет просмотр найден для id 0x1020011 для фрагмент MyFragment
CODE
main.xml
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/tabhost"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="5dp"
android:layout_weight="1" />
<TabWidget
android:id="@android:id/tabs"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="0" />
</LinearLayout>
</TabHost>
MainActivity.java
public class MainActivity extends TabActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Resources res = getResources();
final TabHost tabs = getTabHost();
TabHost.TabSpec spec;
Intent i;
i = new Intent(this, MyActivity.class);
spec = tabs.newTabSpec("MyActivity").setIndicator("MyActivity",res.getDrawable(R.drawable.tab)).setContent(i);
tabs.addTab(spec);
}
}
MyActivity.class
public class MyActivity extends FragmentActivity {
private static String TAG = "MyActivity";
private static FragmentManager fragmentManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
ListeResultatFragment fragment = MyFragment.newInstance();
fragmentTransaction.add(android.R.id.tabcontent, fragment, "MyFragment");
fragmentTransaction.commit();
}
}
MyFragment.java
public class MyFragment extends Fragment {
public static MyFragment newInstance() {
MyFragment instance = new MyFragment();
return instance;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment, container, false);
}
}
Ответы
Ответ 1
Проблема заключается в том, что ваш MyActivity
пытается связаться с MainActivity
с помощью android.R.id.tabcontent
в качестве идентификатора контейнера. Это невозможно. Вместо этого MyActivity
должен иметь свой собственный макет (например, FrameLayout), который может использоваться в качестве родителя для фрагмента. В этом макете должно существовать представление, на которое может ссылаться идентификатор.
Скажем, у вас есть макет под названием activity_layout.xml
, который содержит FrameLayout с id 'framelayout'. Затем вы можете изменить метод onCreate
в MyActivity
примерно так:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View parent = getLayoutInflater().inflate(R.layout.activity_layout, null);
setContentView(parent);
fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Fragment fragment = MyFragment.newInstance();
fragmentTransaction.add(R.id.framelayout, fragment, "MyFragment");
fragmentTransaction.commit();
}
Другими словами, MyActivity
должен работать самостоятельно. Попробуйте сначала запустить его, а затем вставьте MyActivity
в MainActivity
, содержащий TabHost.
Ответ 2
Почему бы вам не создать свою собственную вкладку. Это легко создать. Просто добавьте LinearLayout с некоторыми кнопками в нем и установите onClickListener для переключения фрагментов с помощью FragmentManager. Менеджер фрагментов можно получить из FragmentActivity.
FragmentManager fragmentManager = getSupportFragmentManager();
В обработчике onClick вы просто выполняете транзакцию с коммутатором на нужные фрагменты.