Android 1.6 & Фрагмент и Tabhost - PullRequest
16 голосов
/ 02 июля 2011

Я работаю над обновлением приложения Android (совместимость 1.6), которое использует TabHost для отображения 3 разных вкладок с вложенными действиями.

В то время я использовал трюк ActivityGroup, чтобы показать вложенные действия на вкладке, но я очень недоволен этим методом, потому что работать с некоторыми функциями очень сложно.

Я слышал о пакете совместимости API Fragments для 1.6, и Fragment выглядит идеально для того, что я хочу сделать (показывать вложенные представления / функции на вкладке с эффектами перехода и прочим), но я не могу заставить его работать TabHost (Он должен был работать с Action Bar, но он не доступен в пакете совместимости).

Кто-нибудь из вас, ребята, нашел способ создать такую ​​структуру в своих приложениях?

Моя ошибка здесь:

ERROR/AndroidRuntime(955): Caused by: java.lang.RuntimeException: Unable

чтобы начать деятельность ComponentInfo {com.XXX}: java.lang.IllegalArgumentException: нет для id 0x1020011 найден просмотр фрагмент MyFragment

КОД

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);
    }

}

Ответы [ 2 ]

10 голосов
/ 08 июля 2011

Проблема в том, что ваш MyActivity пытается связаться с включающим MainActivity, используя android.R.id.tabcontent в качестве идентификатора контейнера. Это невозможно. Вместо этого MyActivity должен иметь свой собственный макет (например, FrameLayout), который можно использовать в качестве родительского для фрагмента. В этом макете должно существовать представление, на которое может ссылаться идентификатор.

Допустим, у вас есть макет с именем activity_layout.xml, который содержит FrameLayout с идентификатором '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.

4 голосов
/ 07 июля 2011

Почему бы вам не создать свою собственную вкладку.Это очень легко построить.Просто добавьте LinearLayout с несколькими кнопками и установите onClickListener для переключения фрагментов с помощью FragmentManager.Менеджер фрагментов может быть получен из FragmentActivity.

FragmentManager fragmentManager = getSupportFragmentManager();

В обработчике onClick вы просто делаете транзакцию для переключения на правильные фрагменты.

...