Chronometer doesn't draw when initially added to layout

387 Views Asked by At

I'm trying to write a simple timer app. I'm creating a counter class that extends chronometer. Anyway, when I add the custom chronometer to my layout in onCreate(), it doesn't get drawn. It only gets drawn later when I switch to another tab, and then come back to the "counter up tab." After that it stays. Basically, how do I get it to draw? I tried calling invalidate() but nothing seems to work.

Here's the code in question:

This is inside my onCreate(). I'm adding the custom Chronometer to a linear layout called linLay.

    public class TimerMain extends Activity {

    // Handle to the tabhost
    public TabHost tabHost;

    // Handle to the tab widget (this is the view that has the two tabs)
    public TabWidget tabWidget;

    // Handle to the LinearLayout inside the ScrollView
    public LinearLayout linLay;

    // Spec used to create the tabs
    public TabSpec spec;

    // Up Counter handle
    public UpCounter myUpCounter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Set the view to the main layout (see main.xml)
        setContentView(R.layout.main);

        // Get the handle to the tabhost in the layout and set it up
        tabHost = (TabHost) this.findViewById(R.id.my_tabhost);
        tabHost.setup();

        // Get the handle to the TabWidget that is in the 
        // xml file through the TabHost handle
        tabWidget = tabHost.getTabWidget();

        // Get the handle to the relative layout that is inside of the frame
        // that is used for the tab contents
        linLay = (LinearLayout) this.findViewById(R.id.LinLay);

        // Create the Count Up tab and leave it blank
        spec = tabHost.newTabSpec("CU");
        spec.setIndicator("Count Up");
        spec.setContent(R.id.ScrLay);
        tabHost.addTab(spec);

        // Create the Count Down tab and leave it blank
        spec = tabHost.newTabSpec("CD");
        spec.setIndicator("Count Down");
        spec.setContent(R.id.ScrLay);
        tabHost.addTab(spec);

        // Set up the click listeners for each tab
        initTabClickListen();

        // Start with the Count Up tab selected
        tabHost.setCurrentTab(0);

        // Initialize the first counters
        myUpCounter = initFirstCounters(this.getApplicationContext());        
        myUpCounter.start();
        myUpCounter.setBase(SystemClock.elapsedRealtime());
        //Add the first UpCounter to the scroll view
        linLay.addView(myUpCounter);

    }

    @Override
    protected void onResume(){
        super.onResume();
    }

    private UpCounter initFirstCounters(Context context) {
        UpCounter tempCt;
        // Create the first counter
        tempCt = new UpCounter(context);
        tempCt.setFormat("Initial Format: %s");
        return tempCt;

    }

    // Set up the click listeners for each tab
    private void initTabClickListen() {

        // Set up the listener for the Count Up Tab
        tabWidget.getChildAt(0).setOnClickListener(new OnClickListener(){
            public void onClick(View v){
                // Detach all views from the layout
                // and add the views for this tab.
                linLay.removeAllViews();
                linLay.addView(myUpCounter);


                // Set the current tab to Count Up
                tabHost.setCurrentTab(0);
            }
        });

        // Set up the listener for the Count Down Tab
        tabWidget.getChildAt(1).setOnClickListener(new OnClickListener(){
            public void onClick(View v){
                // Detach all views from the layout
                // and add the views for this tab.
                linLay.removeAllViews();
                //scrLay.addView(v2);

                // Set the current tab to Count Down
                tabHost.setCurrentTab(1);
            }
        });

    }
}

// Custom Counter Class
class UpCounter extends Chronometer{

    public UpCounter(Context context) {
        super(context);

    }

}

and last, here is the .xml in case you want to see it. I've also tried this by removing the linearlayout and using the scrollview instead to holst the chronometer, I have the same issue.

<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/my_tabhost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <LinearLayout 
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"/>
         <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">

            <ScrollView 
                android:id="@+id/ScrLay"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content">

                <LinearLayout 
                    android:id="@+id/LinLay"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:orientation="vertical">
                </LinearLayout>

             </ScrollView>

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

How can I get this counter to appear upon start of the application?

2

There are 2 best solutions below

0
On BEST ANSWER

I figured it out.

For some reason if I just add this to my code in onCreate():

// Start with the Count Up tab selected
tabHost.setCurrentTab(1);
tabHost.setCurrentTab(0);

It all works right now!

2
On

See this developer's Demo.

Here they have learn how to make the Tab Based Application.

Now, create activity and set it to the tabhost. And create chronometer on that activity.

If not Solved then let me know.