androidlayoutparamsandroid-windowmanagerclipped

Tab Widget not displaying correctly onResume()


I'm using a custom TabWidget to display my tabs. The tabs work wonderfully when I first run the program. Everything looks beautiful. However, when I reload the program and, according the logcat, the onResume() method is called on my Tab Widget, the TabWidget displays only the top half of the widget. Here is the XML for my TabWidget.

<?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" >

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">

        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_above="@android:id/tabs"/>

        <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="fill_parent"
            android:layout_height="55dp"
            android:layout_alignParentBottom="true" />

    </RelativeLayout>

</TabHost>

It's pretty plain vanilla stuff here. Changing the layout_height doesn't help.

I am currently not implementing onResume in my TabWidget.java. But heres the code anyway.

public class TabWidget extends TabActivity {

    private TabHost mTabHost;

    private void setupTabHost() {
        mTabHost = (TabHost) findViewById(android.R.id.tabhost);
        mTabHost.setup();
    }

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.tabs);

        Resources res = getResources(); // Resource object to get Drawables
        TabHost tabHost = (TabHost) findViewById(android.R.id.tabhost); // The
                                                                        // activity
                                                                        // TabHost

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

        setupTabHost();
        // mTabHost.getTabWidget().setDividerDrawable(R.drawable.tab_divider);

        // Dealer tab
        Intent intentDealer = new Intent().setClass(this, DealerActivity.class);
        int iconDealer = (R.drawable.ic_tab_dealer);
        setupTab("Dealer", intentDealer, iconDealer);

        // Department tab
        Intent intentDept = new Intent().setClass(this, DeptActivity.class);
        int iconDept = R.drawable.ic_tab_dept;
        setupTab("Departments", intentDept, iconDept);

        // PostBoard Activity
        Intent intentBoard = new Intent().setClass(this, BoardActivity.class);
        int iconBoard = R.drawable.ic_tab_board;
        setupTab("Postboard", intentBoard, iconBoard);

        // Social Network connection
        // Check first to see if there are Social Network links if not don't
        // show tab.
        if (Startup.msMain.locations[Startup.nChosenLocation].social_media_feeds.length == 0) {

        } else {
            Intent intentSocial = new Intent().setClass(this,
                    SocialActivity.class);
            int iconSocial = R.drawable.ic_tab_social;
            setupTab("Social Media", intentSocial, iconSocial);
        }

        // Links Activity
        Intent intentLinks = new Intent().setClass(this, LinksActivity.class);
        int iconLinks = R.drawable.ic_tab_link;
        setupTab("Links", intentLinks, iconLinks);

        // set startup tab
        tabHost.setCurrentTab(0);
    }

    private void setupTab(final String tag, Intent intent, int img) {
        View tabview = createTabView(mTabHost.getContext(), tag, img);

        TabSpec setContent = mTabHost.newTabSpec(tag).setIndicator(tabview)
                .setContent(intent);

        mTabHost.addTab(setContent);

    }

    private static View createTabView(final Context context, final String text,
            int img) {
        View view = LayoutInflater.from(context)
                .inflate(R.layout.tabs_bg, null);
        TextView tv = (TextView) view.findViewById(R.id.tabsText);
        tv.setText(text);
        ImageView icon = (ImageView) view.findViewById(R.id.tabsIcon);
        icon.setBackgroundDrawable(context.getResources().getDrawable(img));
        return view;
    }
}

And for thoroughness here's my logcat when the error appears.

   12-28 10:10:00.963: I/ActivityManager(1305): Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.zocalolabs.demo/.SplashScreen } from pid 1470
   12-28 10:10:01.034: W/InputManagerService(1305): Starting input on non-focused client com.android.internal.view.IInputMethodClient$Stub$Proxy@40777988 (uid=10001 pid=1470)
   12-28 10:10:01.073: I/ActivityManager(1305): Resumed Activity: com.zocalolabs.demo/.TabWidget totalTime: 110 ms

Is there a way to force my widget activity to redraw on onResume() or onPause() force it to full on kill the Activity thus forcing it to the onCreate method again? Or is there another way to attack this problem? Thanks for any insights!


Solution

  • The problem was that

        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
    

    was clipping the bottom of the activity view. I don't know if this is a bug or what but the fix was to add the following line.

       getWindow().setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
                WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
    

    Hope this helps someone else.