简体   繁体   English

将Tabhost添加到android项目

[英]Adding a Tabhost to an android project

I'm following the sample provided in this link to create a TabHost. 我正在按照此链接中提供的示例创建TabHost。 But I got "Fatal Exception" error. 但是我收到“致命异常”错误。 --> http://developer.android.com/reference/android/app/TabActivity.html -> http://developer.android.com/reference/android/app/TabActivity.html

activity_main.xml activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    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"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context="polimi.aap.yas.personalhealthrecord.MainActivity">


    <android.support.v4.app.FragmentTabHost
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@android:id/tabhost"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <TabWidget
                android:id="@android:id/tabs"
                android:orientation="horizontal"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="0"/>

            <FrameLayout
                android:id="@android:id/tabcontent"
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:layout_weight="0"/>

            <FrameLayout
                android:id="@+id/realtabcontent"
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1"/>

        </LinearLayout>
    </android.support.v4.app.FragmentTabHost>
</RelativeLayout>

MainActivity.java MainActivity.java

    package polimi.aap.yas.personalhealthrecord;
    import android.os.Bundle;
    import android.support.v4.app.FragmentActivity;
    import android.support.v4.app.FragmentTabHost;


    public class MainActivity extends FragmentActivity {


        private FragmentTabHost mTabHost;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.activity_main);

        mTabHost = (FragmentTabHost)findViewById(android.R.id.tabhost);
        mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent);
      mTabHost.addTab(mTabHost.newTabSpec("t1").setIndicator("Login"),Login.class,null);
        mTabHost.addTab(mTabHost.newTabSpec("t2").setIndicator("Register"),SignUp.class,null);


    }
}

build.gradle (module:app) build.gradle(module:app)

    apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    useLibrary 'org.apache.http.legacy'


    defaultConfig {
        applicationId "polimi.aap.yas.personalhealthrecord"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.android.support:support-v4:23.1.1'
}

And finally this the logcat 最后是logcat

12-09 14:53:14.184 3570-3570/? 12-09 14:53:14.184 3570-3570 /? D/dalvikvm: Not late-enabling CheckJNI (already on) 12-09 14:53:14.314 3570-3570/? D / dalvikvm:不是延迟启用CheckJNI(已启用)12-09 14:53:14.314 3570-3570 /? D/AndroidRuntime: Shutting down VM 12-09 14:53:14.314 3570-3570/? D / AndroidRuntime:关闭VM 12-09 14:53:14.314 3570-3570 /? W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0xb1777678) 12-09 14:53:14.334 3570-3570/? W / dalvikvm:线程ID = 1:线程以未捕获的异常退出(group = 0xb1777678)12-09 14:53:14.334 3570-3570 /? E/AndroidRuntime: FATAL EXCEPTION: main java.lang.ClassCastException: polimi.aap.yas.personalhealthrecord.Login cannot be cast to android.support.v4.app.Fragment at android.support.v4.app.Fragment.instantiate(Fragment.java:423) at android.support.v4.app.FragmentTabHost.doTabChanged(FragmentTabHost.java:343) at android.support.v4.app.FragmentTabHost.onAttachedToWindow(FragmentTabHost.java:280) at android.view.View.dispatchAttachedToWindow(View.java:12125) at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2453) at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2460) at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2460) at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2460) at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2460) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1207) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1004) at android.view.ViewRootImpl$TraversalRunnabl E / AndroidRuntime:致命例外:main java.lang.ClassCastException:polimi.aap.yas.personalhealthrecord.Login无法转换为android.support.v4.app.Fragment,位于android.support.v4.app.Fragment.instantiate(Fragment .java:423)(位于android.support.v4.app.FragmentTabHost.doTabChanged(FragmentTabHost.java:343)位于android.support.v4.app.FragmentTabHost.onAttachedToWindow(FragmentTabHost.java:280)位于android.view.View。 android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2453)的dispatchAttachedToWindow(View.java:12125)android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2460)的android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java) :2460),位于android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2460),位于android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2460),位于android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1207) .view.ViewRootImpl.doTraversal(ViewRootImpl.java:1004)在android.view.ViewRootImpl $ TraversalRunnabl e.run(ViewRootImpl.java:5481) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749) at android.view.Choreographer.doCallbacks(Choreographer.java:562) at android.view.Choreographer.doFrame(Choreographer.java:532) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735) at android.os.Handler.handleCallback(Handler.java:730) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:5103) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:525) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) at dalvik.system.NativeStart.main(Native Method) 12-09 14:58:15.149 3570-3570/? android.view.Choreographer $ CallbackRecord.run(Choreographer.java:749)的e.run(ViewRootImpl.java:5481)android.view.Choreographer.doFrame的android.view.Choreographer.doCallbacks(Choreographer.java:562)的e.run(ViewRootImpl.java:5481) (Choreographer.java:532)在android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:735)在android.os.Handler.handleCallback(Handler.java:730)在android.os.Handler.dispatchMessage(Handler。 java.92中的android.os.Looper.loop(Looper.java:137)在java.lang.reflect.Method.invokeNative(本机方法)处android.app.ActivityThread.main(ActivityThread.java:5103) com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:737)的com.android.internal.os.ZygoteInit.main(ZygoteInit)的.lang.reflect.Method.invoke(Method.java:525) .java:553),请访问dalvik.system.NativeStart.main(Native Method)12-09 14:58:15.149 3570-3570 /? I/Process: Sending signal. I / Process:正在发送信号。 PID: 3570 SIG: 9 PID:3570 SIG:9

Do you see any problem? 你有什么问题吗? thank you in advance for your helps. 预先感谢您的帮助。 Let me add my objective by writing this code also. 让我也通过编写此代码来添加我的目标。 I need to have a tabhost to show two tabs (Login and Register). 我需要一个tabhost来显示两个选项卡(“登录”和“注册”)。 and fill the content of each tab by related layout(login.xml and signup.xml). 并按相关布局(login.xml和signup.xml)填充每个选项卡的内容。

Login.java Login.java

    package polimi.aap.yas.personalhealthrecord;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class Login extends AppCompatActivity {

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
    }
}

Your problem is that your Login class is an AppCompatActivity , and not a Fragment . 您的问题是您的Login类是AppCompatActivity ,而不是Fragment

When you add a tab to the TabHost , you should pass a .class as you did. 将选项卡添加到TabHost ,应该像以前那样传递.class However, this .class should be from a defined Fragment , not AppCompatActivity . 但是,此.class应该来自已定义的Fragment ,而不是AppCompatActivity

So it should be 所以应该

mTabHost.addTab(mTabHost.newTabSpec("t1").setIndicator("Login"),Login.class,null);

where 哪里

public class Login extends Fragment {
    /**/
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM