无法向tabhost Android添加标签(API 17 +)

时间:2016-03-03 14:47:41

标签: android android-fragments android-tabhost

我构建我的第一个应用程序,一切正常,直到我添加一个菜单(导航抽屉)我添加了菜单,现在我需要使用片段和嵌套片段为我的内容而不是片段活动。

我尝试构建的是: enter image description here

有两个标签可在列表和地图视图之间切换。 在它下面我需要3个按钮来选择显示的内容,例如所有警报,只有1级警报或只有2级警报。

主要活动布局:

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <FrameLayout
        android:id="@+id/fr_content_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </FrameLayout>
    <ListView
        android:id="@+id/lv_menu"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="left">
    </ListView>
</android.support.v4.widget.DrawerLayout>

Fragment_main布局:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="aaeu.app.presentationlayer.MainFragment">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="450dp">
        <TabHost xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:id="@android:id/tabhost">

            <LinearLayout
                android:id="@+id/LinearLayout01"
                android:orientation="vertical"
                android:layout_height="fill_parent"
                android:layout_width="fill_parent">

                <TabWidget
                    android:id="@android:id/tabs"
                    android:layout_height="wrap_content"
                    android:layout_width="fill_parent">
                    <FrameLayout
                        android:id="@android:id/tabcontent"
                        android:layout_height="fill_parent"
                        android:layout_width="fill_parent">
                    </FrameLayout>
                </TabWidget>
            </LinearLayout>
        </TabHost>
    </LinearLayout>

    <LinearLayout
        android:weightSum="3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="450dp">
        <Button
            android:layout_weight="1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/all_alerts"
            android:id="@+id/btn_all_alerts"/>
        <Button
            android:layout_weight="1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/amber_alerts"
            android:id="@+id/btn_ambert_alerts"/>
        <Button
            android:layout_weight="1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/endangered_missings"
            android:id="@+id/btn_missings"/>
    </LinearLayout>
</FrameLayout>

主要片段代码:

import android.app.Fragment;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TabHost;

import aaeu.app.R;


public class MainFragment extends Fragment {

    private TabHost mTabHost;

    public MainFragment() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View v = inflater.inflate(R.layout.fragment_main, container, false);

        mTabHost = (TabHost)v.findViewById(android.R.id.tabhost);
        mTabHost.setup();

        mTabHost.addTab(mTabHost.newTabSpec("tab1").setIndicator("Tab1"),
                AlertOverviewMapsFragment.class, null);
        mTabHost.addTab(mTabHost.newTabSpec("tab2").setIndicator("Tab2"),
                AlertOverviewListFragment.class, null);
        return v;
    }
}

列出片段布局

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".presentationlayer.AlertOverviewListFragment">

<ListView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/lv_alert_overview"></ListView>    
</FrameLayout>

列出片段代码:

import android.app.ActivityOptions;
import android.content.Intent;
import android.os.Bundle;
import android.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;

import aaeu.app.R;
import aaeu.app.businesslayer.AppManager;
import aaeu.app.datalayer.Alert;
import aaeu.app.datalayer.e_Alerts;
import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnItemClick;

public class AlertOverviewListFragment extends Fragment implements e_Alerts {

    @Bind(R.id.lv_alert_overview) ListView lv_alert_overview;
    List<Alert> alerts = new ArrayList<Alert>();
    AppManager manager;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //Load alerts when fragment starts
        manager = new AppManager();
        final WeakReference<e_Alerts> wr = new WeakReference<e_Alerts>(this);
        this.alerts = manager.getAlerts(wr, this.getContext());
    }

    // Updates the list after asynctask is ready
    @Override
    public void UpdateAlerts(List<Alert> alerts)
    {
        //Fill array adapter with alerts from datalayer and set adapter for the listview
        this.alerts = alerts;
        updateList();
    }

我一直得到错误: 错误:(39,17)错误:类TabHost中的方法addTab无法应用于给定类型; 必需:TabHost.TabSpec 发现:TabHost.TabSpec,Class, 原因:实际和正式的参数列表长度不同

我知道这不是关于这个问题的第一个话题/问题我读了很多问题。我从其中一个人那里得到了这个解决方案,但我无法让它发挥作用。

我认为这与import android.app.Fragment;import android.support.v4.app.Fragment;有关,但我不确定。我只需要API17和更新版本的支持,所以我不需要支持库。 有人可以解释一下我做错了什么吗?我更喜欢一个解决方案,我不需要更改我的整个应用程序或编辑所有类/片段或其他东西。

---------------- UPDATE ----------------

何时使用:

        // Tab for Listview
        TabHost.TabSpec listspec = mTabHost.newTabSpec("Listview");
// setting Title for the Tab
        listspec.setIndicator("Listview");
        Intent listIntent = new Intent(getContext(), AlertOverviewListFragment.class);
        listspec.setContent(listIntent);

   mTabHost.addTab(listspec);

而不是:

    mTabHost.addTab(mTabHost.newTabSpec("tab2").setIndicator("Tab2"),
            AlertOverviewListFragment.class, null);

我收到了错误

Unable to start activity ComponentInfo{aaeu.app/aaeu.app.presentationlayer.MainActivity}: java.lang.IllegalStateException: Did you forget to call 'public void setup(LocalActivityManager activityGroup)'?

0 个答案:

没有答案