user1455536
user1455536

Reputation: 27

Extended TextView not appearing

The following code is suppose to be doing this :
- Displaying a string using a standard TextView
- Displaying a string using a extended TextView. (This one overrides OnDraw and draws a line across the string, making it look like it was striked out)

The problem is that only the standard one is appearing.

Please check the following code :

ExpenseWatchActivity.java (This is the main activity)

package com.app.expensewatch;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import java.util.Calendar;

public class ExpenseWatchActivity extends Activity {

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        int day,mon,yr;

        Calendar cal = Calendar.getInstance();

        day = cal.get(Calendar.DATE);
        mon = 1 + cal.get(Calendar.MONTH);
        yr = cal.get(Calendar.YEAR);

        String text = getResources().getString(R.string.hello, day , mon , yr);

        TextView tx1 = (TextView)findViewById(R.id.text1);
        tx1.setText(text);

        List1 list = (List1)findViewById(R.id.list1);
        list.setText(text);
    }
}

List1.java (This is the extended TextView)

package com.app.expensewatch;

import android.util.AttributeSet;
import android.widget.TextView;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import com.app.expensewatch.R;

public class List1 extends TextView {

    public List1(Context context) {
        super(context);
    }

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

    public List1(Context context, AttributeSet attrs, int defStyle) {
        super( context, attrs, defStyle );
    }

    float ht = (float)getHeight();
    float wd = (float)getWidth();

    @Override
    protected void onDraw(Canvas canvas)
    {
        Paint divider = new Paint();
        divider.setColor(getResources().getColor(R.color.line1));
        canvas.drawLine(0,ht/2,wd,ht/2,divider);
    }
}

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/text1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello" />

    <com.app.expensewatch.List1
        android:id="@+id/list1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello" />
       />
 </LinearLayout>

strings.xml

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

   <string name="app_name">ExpenseWatch</string>
   <string name="hello">Today is : %1$d / %2$d / %3$d</string>

</resources>

colors.xml

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

    <color name="line1">#6456648f</color>

</resources>

Upvotes: 1

Views: 529

Answers (1)

Flynn81
Flynn81

Reputation: 4178

When you set your width and height in the extended TextView, the view hasn't been measured yet. Its width and height are zero. Override onMeasure() in your extended TextView, and set your width and height there.

protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    ht = getHeight();
    wd = getWidth();    
}

Always avoid setting a private variable that will hold a dimension in a view until after onMeasure() has been called.

Upvotes: 1

Related Questions