2

I am trying to initialize a TableLayout in XML and then fill it in programmatically. Here is my XML, java and LogCat output.

Highscores.java

public class Highscores extends Activity {

    TableLayout table;
    TableRow rowHeader, row1, row2, row3, row4, row5, row6, row7, row8, row9, row10;
    TextView rank, percentage, score;
    Button btn1;    

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.highscoresmain);

        TableLayout table = (TableLayout)findViewById(R.id.tableLayout);

        TextView rank = (TextView)findViewById(R.id.rank);
        rank.setText("RANK");
        TextView percentage = (TextView)findViewById(R.id.percentage);
        percentage.setText("PERCENTAGE");
        TextView score = (TextView)findViewById(R.id.score);
        score.setText("SCORE");

        TableRow rowHeader = (TableRow)findViewById(R.id.rowHeader);

        rowHeader.addView(rank);  //Line 39
        rowHeader.addView(percentage);
        rowHeader.addView(score);

        Button btn1 = (Button)findViewById(R.id.homeBtn);

        table.addView(rowHeader, new TableLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

        btn1.setOnClickListener(new OnClickListener() {
            public void onClick(View arg0) {
                Intent intent = new Intent(Highscores.this, MainMenu.class);
                startActivity(intent);
            }
        });
    }
}

highscoresmain.xml

<TableLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id = "@+id/tableLayout"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight="0"
    android:padding="5dp">

    <TableRow 
        android:layout_height="wrap_content"
        android:id="@+id/rowHeader">
        <TextView
            android:id="@+id/rank"
            android:layout_height="wrap_content" />
        <TextView
            android:id="@+id/percentage"
            android:layout_height="wrap_content" />
        <TextView
            android:id="@+id/score"
            android:layout_height="wrap_content" />
    </TableRow>
      </TableLayout>

LogCat

12-19 06:03:36.960: E/AndroidRuntime(20130): FATAL EXCEPTION: main
12-19 06:03:36.960: E/AndroidRuntime(20130): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.test/com.example.test.Highscores}: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
12-19 06:03:36.960: E/AndroidRuntime(20130):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
12-19 06:03:36.960: E/AndroidRuntime(20130):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
12-19 06:03:36.960: E/AndroidRuntime(20130):    at android.app.ActivityThread.access$600(ActivityThread.java:130)
12-19 06:03:36.960: E/AndroidRuntime(20130):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
12-19 06:03:36.960: E/AndroidRuntime(20130):    at android.os.Handler.dispatchMessage(Handler.java:99)
12-19 06:03:36.960: E/AndroidRuntime(20130):    at android.os.Looper.loop(Looper.java:137)
12-19 06:03:36.960: E/AndroidRuntime(20130):    at android.app.ActivityThread.main(ActivityThread.java:4745)
12-19 06:03:36.960: E/AndroidRuntime(20130):    at java.lang.reflect.Method.invokeNative(Native Method)
12-19 06:03:36.960: E/AndroidRuntime(20130):    at java.lang.reflect.Method.invoke(Method.java:511)
12-19 06:03:36.960: E/AndroidRuntime(20130):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
12-19 06:03:36.960: E/AndroidRuntime(20130):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
12-19 06:03:36.960: E/AndroidRuntime(20130):    at dalvik.system.NativeStart.main(Native Method)
12-19 06:03:36.960: E/AndroidRuntime(20130): Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
12-19 06:03:36.960: E/AndroidRuntime(20130):    at android.view.ViewGroup.addViewInner(ViewGroup.java:3378)
12-19 06:03:36.960: E/AndroidRuntime(20130):    at android.view.ViewGroup.addView(ViewGroup.java:3249)
12-19 06:03:36.960: E/AndroidRuntime(20130):    at android.view.ViewGroup.addView(ViewGroup.java:3194)
12-19 06:03:36.960: E/AndroidRuntime(20130):    at android.view.ViewGroup.addView(ViewGroup.java:3170)
12-19 06:03:36.960: E/AndroidRuntime(20130):    at com.example.test.Highscores.onCreate(Highscores.java:39)
12-19 06:03:36.960: E/AndroidRuntime(20130):    at android.app.Activity.performCreate(Activity.java:5008)
12-19 06:03:36.960: E/AndroidRuntime(20130):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
12-19 06:03:36.960: E/AndroidRuntime(20130):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
12-19 06:03:36.960: E/AndroidRuntime(20130):    ... 11 more

What I want is a simple 3 column table with row 1 headings being "RANK", "PERCENTAGE" AND "SCORE". Later I will have 10 more rows that I will pull from a SQLite database but I will tackle that afterwards.

3 Answers 3

3

Your xml file will be editting;

I am trying to initialize a TableLayout in XML and then fill it in programmatically. Here is my XML, java and LogCat output.

highscoresmain.xml

<TableLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id = "@+id/tableLayout"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight="0"
    android:padding="5dp">


   </TableLayout>

Highscores class content;

public class Highscores extends Activity {

    TableLayout table;
    TableRow rowHeader, row1, row2, row3, row4, row5, row6, row7, row8, row9, row10;
    TextView rank, percentage, score;
    Button btn1;    

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.highscoresmain);

        TableLayout table = (TableLayout)findViewById(R.id.tableLayout);

        TextView rank = new TextView(this);
        rank.setText("RANK");
        TextView percentage = new TextView(this);
        percentage.setText("PERCENTAGE");
        TextView score = new TextView(this);
        score.setText("SCORE");

        TableRow rowHeader = new TableRow(this);

        rowHeader.addView(rank);  //Line 39
        rowHeader.addView(percentage);
        rowHeader.addView(score);

        Button btn1 = (Button)findViewById(R.id.homeBtn);

        table.addView(rowHeader);

        btn1.setOnClickListener(new OnClickListener() {
            public void onClick(View arg0) {
                Intent intent = new Intent(Highscores.this, MainMenu.class);
                startActivity(intent);
            }
        });
    }
}
Sign up to request clarification or add additional context in comments.

4 Comments

when I invoke addview of TableLayout it make exception . why?
Do you add which view and how?
I want to add table row containing two text view
Which exception do you get?
1

You do not need following code:

TableRow rowHeader = (TableRow)findViewById(R.id.rowHeader);

rowHeader.addView(rank);  //Line 39
rowHeader.addView(percentage);
rowHeader.addView(score);

table.addView(rowHeader, new TableLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

Since they are already defined in the layout.

Comments

1

The answer is in your logcat:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.test/com.example.test.Highscores}: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

The TextViews are already inside the TableRow, if you want to fill it programmatically, just remove all the children of your TableLayout, create them in code and add them in the Activity's onCreate as you just did.

Good luck!

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.