2

So I made a TabHot by dragging and dropping and then codded in the tabs to make it work and it worked. However I had to use the tab linear layouts for the content which is inconvient. So I decided to make a separate activity for each tab. Now when I change set content to the intent of the class my project crashes. I've googled this and looked for fixes but nothing.

Here's my code:

public class MainActivity extends AppCompatActivity {

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

private void InitTabHost(){

    //Setup Initial Tab Host
    TabHost tbHost = (TabHost)findViewById(R.id.tabHost);
    tbHost.setup();

    //Setup Tab 1

    TabHost.TabSpec NFtab = tbHost.newTabSpec("one");
    NFtab.setIndicator("News Feed");
    Intent intent = new Intent(this,NewsFeed.class);
    NFtab.setContent(intent);
    tbHost.addTab(NFtab);

    TabHost.TabSpec AGTab = tbHost.newTabSpec("two");
    AGTab.setIndicator("Art Gallery");
    AGTab.setContent(R.id.tab2);
    tbHost.addTab(AGTab);

    TabHost.TabSpec CreateTab = tbHost.newTabSpec("three");
    CreateTab.setIndicator("Create");
    CreateTab.setContent(R.id.tab3);
    tbHost.addTab(CreateTab);

    TabHost.TabSpec ProfileTab = tbHost.newTabSpec("Four");
    ProfileTab.setIndicator("Profile");
    ProfileTab.setContent(R.id.tab4);
    tbHost.addTab(ProfileTab);
}}

here's my main layout with the tabhost:

<?xml version="1.0" encoding="utf-8"?>

<TabHost
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/tabHost">

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

        <TabWidget
            android:id="@android:id/tabs"
            android:layout_alignParentBottom="true"
            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
                android:id="@+id/tab1"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical">

            </LinearLayout>

            <LinearLayout
                android:id="@+id/tab2"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical">

            </LinearLayout>

            <LinearLayout
                android:id="@+id/tab3"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical">

            </LinearLayout>

            <LinearLayout
                android:id="@+id/tab4"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical">

            </LinearLayout>
        </FrameLayout>
    </RelativeLayout>
</TabHost>

and here's the other activity class:

public class NewsFeed extends TabActivity {

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

Edit Logcat:

07/28 01:56:29: Launching app
$ adb shell am start -n "com.example.akashbakshi.artnsketch/com.example.akashbakshi.artnsketch.MainActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER
Connected to process 3940 on device Nexus_6P_API_23 [emulator-5554]
I/art: Not late-enabling -Xcheck:jni (already on)
W/System: ClassLoader referenced unknown path: /data/app/com.example.akashbakshi.artnsketch-2/lib/x86
W/System: ClassLoader referenced unknown path: /data/app/com.example.akashbakshi.artnsketch-2/lib/x86
W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.example.akashbakshi.artnsketch, PID: 3940
                  java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.akashbakshi.artnsketch/com.example.akashbakshi.artnsketch.MainActivity}: java.lang.IllegalStateException: Did you forget to call 'public void setup(LocalActivityManager activityGroup)'?
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
                      at android.app.ActivityThread.-wrap11(ActivityThread.java)
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
                      at android.os.Handler.dispatchMessage(Handler.java:102)
                      at android.os.Looper.loop(Looper.java:148)
                      at android.app.ActivityThread.main(ActivityThread.java:5417)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
                   Caused by: java.lang.IllegalStateException: Did you forget to call 'public void setup(LocalActivityManager activityGroup)'?
                      at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:722)
                      at android.widget.TabHost.setCurrentTab(TabHost.java:388)
                      at android.widget.TabHost.addTab(TabHost.java:222)
                      at com.example.akashbakshi.artnsketch.MainActivity.InitTabHost(MainActivity.java:30)
                      at com.example.akashbakshi.artnsketch.MainActivity.onCreate(MainActivity.java:15)
                      at android.app.Activity.performCreate(Activity.java:6237)
                      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
                      at android.app.ActivityThread.-wrap11(ActivityThread.java) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                      at android.os.Looper.loop(Looper.java:148) 
                      at android.app.ActivityThread.main(ActivityThread.java:5417) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
  • Tabhost is old,,better use tablayout – Aditya Vyas-Lakhan Jul 28 '16 at 05:51
  • why you using deprecated `TabActivity ` – IntelliJ Amiya Jul 28 '16 at 05:51
  • 1
    @IntelliJAmiya Like I said I used the deprecated because I was searching using solutions other people had, updated with my logcat I think? I'm new so sorry if that's not the logcat – Akash Bakshi Jul 28 '16 at 06:29
  • For `java.lang.IllegalStateException: Did you forget to call 'public void setup(LocalActivityManager activityGroup)'?` you can visit here http://stackoverflow.com/a/3641250/3395198 – IntelliJ Amiya Jul 28 '16 at 06:31
  • 1
    @IntelliJAmiya so I just tried that and I get this now :java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.akashbakshi.artnsketch/com.example.akashbakshi.artnsketch.NewsFeed}: java.lang.RuntimeException: Your content must have a TabHost whose id attribute is 'android.R.id.tabhost' I've tried changing my tabhost to android:id/tabhost and then my line the android.R.id.tabhost but it still gives that same error? – Akash Bakshi Jul 28 '16 at 06:39
  • http://stackoverflow.com/questions/21301388/error-your-tabhost-must-have-a-tabwidget-whose-id-attribute-is-android-r-id-t and http://stackoverflow.com/questions/8538437/your-content-must-have-a-tabhost-whose-id-attribute-is-android-r-id-tabhost – IntelliJ Amiya Jul 28 '16 at 06:44
  • 1
    @IntelliJAmiya Extending my NewsFeed Class to Activity instead of Tab Activity did the trick thanks! – Akash Bakshi Jul 28 '16 at 06:57

2 Answers2

1

Following this link: Your content must have a TabHost whose id attribute is 'android.R.id.tabhost'

I was able to fix the problem by changing my tabhost to android:id/tabhost and my NewsFeed to Activity.

Community
  • 1
  • 1
0

You can use my code:

There are 2 classes:

MyTabs.java

public class MyTabs extends TabLayout {
    String text;
    public MyTabs(Context context) {
        super(context);
    }

    public MyTabs(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyTabs(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public void setText(String text) {
        this.text = text;
    }

    @Override
    public void setTabTextColors(int normalColor, int selectedColor) {
        super.setTabTextColors(normalColor, selectedColor);
    }

    @Override
    public void setBackgroundColor(int color) {
        super.setBackgroundColor(color);
    }

    @Override
    public void addTab(@NonNull Tab tab) {
        super.addTab(tab);
    }

    @NonNull
    @Override
    public Tab newTab() {
        return super.newTab();
    }

    @Override
    public void setSmoothScrollingEnabled(boolean smoothScrollingEnabled) {
        super.setSmoothScrollingEnabled(smoothScrollingEnabled);
    }

    @Override
    public void setTabMode(int mode) {
        super.setTabMode(mode);
    }

}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>

<android.support.design.widget.AppBarLayout
    android:id="@+id/appbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingTop="@dimen/appbar_padding_top"
    android:theme="@style/AppTheme.AppBarOverlay">


    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:layout_scrollFlags="enterAlways"
        app:popupTheme="@style/AppTheme.PopupOverlay">

    </android.support.v7.widget.Toolbar>

    <com.mypackage.here.MyTabs
        android:id="@+id/mytabs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</android.support.design.widget.AppBarLayout>

<android.support.v4.view.ViewPager
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />

Inside MainActivity.java

    ViewPager mViewPager;
    MyTabs tabs;
    TabLayout.Tab latestTab;
    TabLayout.Tab allVideosTab;


    mViewPager = (ViewPager) findViewById(R.id.container);
    mViewPager.setAdapter(mSectionsPagerAdapter);

    //Tab layout
    tabs = (MyTabs) findViewById(R.id.mytabs);
    tabs.setTabTextColors(Color.LTGRAY, Color.WHITE);
    tabs.setTabGravity(TabLayout.GRAVITY_CENTER);
    tabs.setSmoothScrollingEnabled(true);
    tabs.setTabMode(TabLayout.MODE_SCROLLABLE);
    latestTab = tabs.newTab();
    allVideosTab = tabs.newTab();

    //ADD TABS IN REVERSE ORDER OF APPEARANCE
    tabs.addTab(allVideosTab);
    tabs.addTab(latestTab);

    //*********ADD ALL tabs above this*/
    tabs.setupWithViewPager(mViewPager);

    //Manipulate tabs here
    latestTab.setText("Latest");
    allVideosTab.setText("All Videos");
Geet Choubey
  • 1,069
  • 7
  • 23