当我将项目添加到TabHost时,为什么我失去了功能和风格?我怎样才能找回来?

时间:2013-06-06 08:52:47

标签: android xamarin.android

我最近开始在android开发,我仍然试图了解一些概念。

我正在努力设计一个电话式键盘,我得到的主要是按照我想要的方式工作,例如。

enter image description here

我的下一步是将我们在此处看到的所有内容放入标签中,以便我可以在多个活动之间切换。

我为TabHost使用了以下XML:

<?xml version="1.0" encoding="utf-8"?>
<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:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical">
        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="fill_parent"
            android:layout_height="0dip"
            android:layout_weight="1" />
        <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="fill_parent"
            android:layout_height="70.0dp"
            android:layout_weight="0" />
    </LinearLayout>
</TabHost>

以及以下TabActivity来管理标签逻辑:

[Activity(MainLauncher = true, Label = "@string/app_name", Theme = "@android:style/Theme.NoTitleBar")]
public class TabContainer : TabActivity
{

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

        TabHost.TabSpec spec;     // Resusable TabSpec for each tab
        Intent intent;            // Reusable Intent for each tab

        // Create an Intent to launch an Activity for the tab (to be reused)
        intent = new Intent(this, typeof(KeypadActivity));
        intent.AddFlags(ActivityFlags.NewTask);

        // Initialize a TabSpec for each tab and add it to the TabHost
        spec = TabHost.NewTabSpec("keypad");
        spec.SetIndicator("Keypad", Resources.GetDrawable(Resource.Drawable.keypad_light));
        spec.SetContent(intent);
        TabHost.AddTab(spec);

        // Do the same for the other tabs
        intent = new Intent(this, typeof(LogsActivity));
        intent.AddFlags(ActivityFlags.NewTask);

        spec = TabHost.NewTabSpec("logs");
        spec.SetIndicator("Logs", Resources.GetDrawable(Resource.Drawable.logs_light));
        spec.SetContent(intent);
        TabHost.AddTab(spec);

        intent = new Intent(this, typeof(UnsetActivity));
        intent.AddFlags(ActivityFlags.NewTask);

        spec = TabHost.NewTabSpec("unset");
        spec.SetIndicator("Unset", Resources.GetDrawable(Resource.Drawable.unset_light));
        spec.SetContent(intent);
        TabHost.AddTab(spec);

        TabHost.CurrentTab = 0;
    }

}

虽然标签行为正确,但我已经失去了以前键盘的功能和风格,现在看来如下:

enter image description here

为什么当我使用现有的KeypadActivity并将其插入TabHost时,我会失去功能和风格?如何在TabHost

中保留它

1 个答案:

答案 0 :(得分:0)

事实证明,服务无效的问题是

public void OnServiceConnected(ComponentName name, IBinder service){}

永远不会被召唤。尝试在TabActivity

内启动服务时,这是一个已知问题

要解决此问题,OnStart()方法需要在应用程序上下文中显式调用BindService()方法,例如

    protected override void OnStart ()
    {
        base.OnStart ();

        var intentFilter = new IntentFilter (ServiceClass.UpdatedAction){Priority = (int)IntentFilterPriority.HighPriority};
        RegisterReceiver (_receiver, intentFilter);

        _serviceConnection = new ServiceConnection (this);

        Application.Context.BindService(_intent, _serviceConnection, Bind.AutoCreate);
        // instead of
        // BindService(_intent, _serviceConnection, Bind.AutoCreate);


        StartService(_intent);
    }

RE样式,我必须为按钮指定一个特定的样式,并将其应用于每个样式。