在tabhost中从数据库动态添加选项卡

时间:2014-03-03 12:22:25

标签: xamarin.android xamarin android-tabhost

我尝试从我从数据库中提取的数据中动态添加tabhost中的选项卡。但通常我会得到例外。我想在活动中使用这个tabhost。

这是我的代码:

Main.cs

[Activity (Label = "Main",Theme = "@style/Theme.Splash")]
public class Main : Activity
{
        TabHost tabHost;

    protected override void OnCreate (Bundle bundle)
    {
        base.OnCreate (bundle);

        SetContentView (Resource.Layout.activity_main);
        tabHost = FindViewById<TabHost>(Resource.Id.tabHost1);

        LocalActivityManager localActMgr = new LocalActivityManager(this, false);
        localActMgr.DispatchCreate(bundle);

        CSList<CategoriesArticlesConfig> categories = CategoriesArticlesConfig.List();

        tabHost.Setup(localActMgr);

        foreach (CategoriesArticlesConfig categorie in categories)
        {
            Intent i = new Intent();
            i.SetFlags(ActivityFlags.NewTask);
            i.PutExtra("CategorieID", categorie.CategorieArticlesConfigID);
            i.SetClass(this, typeof(AfficheArticlesTab));
            TabHost.TabSpec tab = tabHost.NewTabSpec("tab_"+categorie.CategorieArticlesConfigID);
            tab.SetIndicator(""+categorie.Nom, Resources.GetDrawable(Android.Resource.Drawable.IcInputAdd));
            tab.SetContent(i);
            tabHost.AddTab(tab);
        }            
    }
}

AfficheArticlesTab.cs

class AfficheArticlesTab : Activity
{
    public AfficheArticlesTab() { }

    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        SetContentView(Resource.Layout.activity_configuration);

        GridView gridView = FindViewById<GridView>(Resource.Id.gv_item_articles_gridview_articles_tab_main_activity);
        LayoutInflater layoutInflater = (LayoutInflater)GetSystemService(Context.LayoutInflaterService);
        View view = layoutInflater.Inflate(Resource.Layout.gridview_articles_tab, null);

        int CategorieID = Intent.Extras.GetInt("CategorieID");

        CategoriesArticlesConfig categorie = CategoriesArticlesConfig.ReadFirst("CategorieArticlesID="+CategorieID);
        gridView.Adapter = new ListArticleConfigAdapter(this,categorie.ArticlesConfig.ToList<ArticlesConfig>());
    }
}

activity_main.axml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:minWidth="25px"
android:minHeight="25px"
android:background="@drawable/background_simple"
android:padding="5dp">
<FrameLayout
    android:minWidth="25px"
    android:minHeight="25px"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/frameLayout1"
    android:layout_margin="5dp"
    android:layout_weight="0.5">
    <LinearLayout
        android:orientation="vertical"
        android:minWidth="25px"
        android:minHeight="25px"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/linearLayout11">
        <LinearLayout
            android:orientation="horizontal"
            android:minWidth="25px"
            android:minHeight="25px"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/linearLayout12"
            android:layout_weight="4">
            <LinearLayout
                android:orientation="vertical"
                android:minWidth="25px"
                android:minHeight="25px"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:id="@+id/linearLayout13"
                android:layout_marginTop="14.0dp"
                android:layout_marginLeft="8.0dp">
                <LinearLayout
                    android:orientation="horizontal"
                    android:minWidth="25px"
                    android:minHeight="25px"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:id="@+id/linearLayout18">
                    <TextView
                        android:textAppearance="?android:attr/textAppearanceMedium"
                        android:layout_width="wrap_content"
                        android:layout_height="fill_parent"
                        android:id="@+id/tv_num_ticket_activity_main" />
                    <TextView
                        android:textAppearance="?android:attr/textAppearanceMedium"
                        android:layout_width="wrap_content"
                        android:layout_height="fill_parent"
                        android:id="@+id/tv_num_caissier_activity_main"
                        android:layout_marginLeft="10dp" />
                </LinearLayout>
                <LinearLayout
                    android:orientation="horizontal"
                    android:minWidth="25px"
                    android:minHeight="25px"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:id="@+id/linearLayout14">
                    <LinearLayout
                        android:orientation="horizontal"
                        android:minWidth="25px"
                        android:minHeight="25px"
                        android:layout_width="fill_parent"
                        android:layout_height="fill_parent"
                        android:id="@+id/linearLayout15"
                        android:layout_weight="0.1">
                        <EditText
                            android:inputType="numberDecimal"
                            android:layout_width="fill_parent"
                            android:layout_height="wrap_content"
                            android:id="@+id/ed_zone_main_activity"
                            android:layout_weight="0.16"
                            android:layout_marginTop="0.0dp" />
                        <TextView
                            android:text="@string/qte_value"
                            android:textAppearance="?android:attr/textAppearanceMedium"
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:id="@+id/tv_qte_value_main_activity"
                            android:layout_weight="0.3"
                            android:layout_marginRight="2.5dp"
                            android:layout_marginLeft="13.3dp"
                            android:layout_gravity="center_vertical"
                            android:gravity="right"
                            android:layout_marginTop="0.0dp"
                            android:textSize="20sp" />
                    </LinearLayout>
                </LinearLayout>
            </LinearLayout>
        </LinearLayout>
        <ListView
            android:minWidth="25px"
            android:minHeight="25px"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/listView1"
            android:layout_weight="1"
            android:layout_marginTop="8.0dp" />
    </LinearLayout>
</FrameLayout>
<LinearLayout
    android:orientation="vertical"
    android:minWidth="25px"
    android:minHeight="25px"
    android:layout_width="match_parent"
    android:layout_height="fill_parent"
    android:id="@+id/linearLayout17"
    android:layout_weight="0.3">
    <FrameLayout
        android:minWidth="25px"
        android:minHeight="25px"
        android:id="@+id/frameLayout2"
        android:layout_width="fill_parent"
        android:layout_height="match_parent"
        android:layout_weight="0.15">
        <LinearLayout
            android:orientation="vertical"
            android:minWidth="25px"
            android:minHeight="25px"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/linearLayout5">
            <TabHost
                android:minWidth="25px"
                android:minHeight="25px"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:id="@+id/tabHost1">
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:orientation="vertical"
                    android:id="@+id/linearLayout19">
                    <TabWidget
                        android:id="@android:id/tabs"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content" />
                    <FrameLayout
                        android:id="@android:id/tabcontent"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent" />
                </LinearLayout>
            </TabHost>
        </LinearLayout>
    </FrameLayout>
    <LinearLayout
        android:orientation="horizontal"
        android:minWidth="25px"
        android:minHeight="25px"
        android:id="@+id/linearLayout16"
        android:layout_width="fill_parent"
        android:layout_height="match_parent"
        android:layout_weight="0.85">
        <Button
            android:text="@string/total"
            android:id="@+id/bt_total_activity_main"
            android:textSize="16sp"
            android:layout_width="match_parent"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:background="@drawable/button_selector_rouge" />
        <Button
            android:text="@string/quantitee"
            android:id="@+id/bt_quantitee_activity_main"
            android:textSize="16sp"
            android:layout_width="match_parent"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:background="@drawable/button_selector_enter" />
        <Button
            android:text="@string/code_barre"
            android:layout_width="match_parent"
            android:layout_height="fill_parent"
            android:id="@+id/bt_code_barre_activity_main"
            android:layout_weight="1"
            android:textSize="16sp"
            android:background="@drawable/button_selector_enter" />
        <Button
            android:text="@string/annuler"
            android:layout_width="match_parent"
            android:layout_height="fill_parent"
            android:id="@+id/bt_annuler_activity_main"
            android:layout_weight="1"
            android:textSize="16sp"
            android:background="@drawable/button_selector_enter" />
        <Button
            android:text="@string/remise"
            android:layout_width="match_parent"
            android:layout_height="fill_parent"
            android:id="@+id/bt_remise_activity_main"
            android:layout_weight="1"
            android:textSize="16sp"
            android:background="@drawable/button_selector_enter" />
        <Button
            android:text="@string/attente"
            android:layout_width="match_parent"
            android:layout_height="fill_parent"
            android:id="@+id/bt_attente_activity_main"
            android:layout_weight="1"
            android:textSize="16sp"
            android:background="@drawable/button_selector_enter" />
    </LinearLayout>
</LinearLayout>

03-03 13:19:08.004 E/mono    ( 7331): Unhandled Exception:
03-03 13:19:08.004 E/mono    ( 7331): Java.Lang.NullPointerException: Exception of type 'Java.Lang.NullPointerException' was thrown.
03-03 13:19:08.004 E/mono    ( 7331): at Android.Runtime.JNIEnv.CallVoidMethod (intptr,intptr,Android.Runtime.JValue[]) [0x00023] in /Users/builder/data/lanes/monodroid-lion-monodroid-4.6.6-branch/6d7480e9/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.g.cs:368
03-03 13:19:08.004 E/mono    ( 7331): at Android.Widget.TabHost.AddTab (Android.Widget.TabHost/TabSpec) [0x0003e] in /Users/builder/data/lanes/monodroid-lion-monodroid-4.6.6-branch/6d7480e9/source/monodroid/src/Mono.Android/platforms/android-14/src/generated/Android.Widget.TabHost.cs:762
03-03 13:19:08.004 E/mono    ( 7331): at SymaMobile.Droid.Main.OnCreate (Android.OS.Bundle) [0x000e8] in f:\PFE\VS2012\SymaMobile\SymaMobile\SymaMobile.Droid\Activities\Main.cs:41
03-03 13:19:08.004 E/mono    ( 7331): at Android.App.Activity.n_OnCreate_Landroid_os_Bundle_ (intptr,intptr,intptr) [0x00010] in /Users/builder/data/lanes/monodroid-lion-monodroid-4.6.6-branch/6d7480e9/source/monodroid/src/Mono.Android/platforms/android-14/src/generated/Android.App.Activity.cs:1859
03-03 13:19:08.004 E/mono    ( 7331): at (wrapper dynamic-m

1 个答案:

答案 0 :(得分:0)

我找到了它:)

首先,您应该扩展TabHost.ITabContentFactory

public class Main : Activity, TabHost.ITabContentFactory

其次,您应该在我的tabhost中添加NewTabSpec。

tabHost.AddTab(tabHost.NewTabSpec("tab_" + categorie.CategorieArticlesConfigID).SetIndicator(createTabView(tabHost.Context, categorie.Nom)).SetContent(this));

最后,您使用实现的方法CreateTabContent,如下所示:

public View CreateTabContent(string tag)
    {
        LayoutInflater layoutInflater = (LayoutInflater)GetSystemService(Context.LayoutInflaterService);

        View view1 = layoutInflater.Inflate(Resource.Layout.gridview_articles_tab, null);
        View view2 = layoutInflater.Inflate(Resource.Layout.list_item_article_configuration, null);
        View view3 = layoutInflater.Inflate(Resource.Layout.tab_item, null);

        GridView gridView = view1.FindViewById<GridView>(Resource.Id.gv_item_articles_gridview_articles_tab_main_activity);

        CategoriesArticlesConfig categorie = CategoriesArticlesConfig.ReadFirst("CategorieArticlesConfigID=" + tabCatID[tabHost.CurrentTab]);

        gridView.Adapter = new ListArticleTabAdapter(this, categorie.ArticlesConfig.ToList());
        gridView.ItemClick += gridView_ItemClick;

        return view1;
    }

谢谢,