0
06-11 15:55:30.911      935-935/com.example.myfirstapp         E/AndroidRuntime: FATAL        EXCEPTION: main
    java.lang.RuntimeException: Unable to start activity       ComponentInfo{com.example.myfirstapp/com.example.myfirstapp.DbQueries}: java.lang.IllegalStateException: The specified child already has a parent. You must call  removeView() on the child's parent first.
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
    at android.app.ActivityThread.access$600(ActivityThread.java:141)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:5041)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
    at dalvik.system.NativeStart.main(Native Method)
    Caused by: java.lang.IllegalStateException: The specified child already has a parent.      You must call removeView() on the child's parent first.
    at android.view.ViewGroup.addViewInner(ViewGroup.java:3339)
    at android.view.ViewGroup.addView(ViewGroup.java:3210)
    at android.view.ViewGroup.addView(ViewGroup.java:3155)
    at android.view.ViewGroup.addView(ViewGroup.java:3131)
    at com.example.myfirstapp.DbQueries$PlanetFragment.onCreateView(DbQueries.java:256)
    at android.app.Fragment.performCreateView(Fragment.java:1695)
    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:885)
    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1057)
    at android.app.BackStackRecord.run(BackStackRecord.java:682)
    at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1435)
    at android.app.Activity.performStart(Activity.java:5113)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2153)

上面是日志猫,下面是有问题的代码(不是整个代码):

 public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_planet, container, false);
        int i = getArguments().getInt(ARG_PLANET_NUMBER);
        // get a reference for the TableLayout

        TableLayout layout = (TableLayout) rootView.findViewById(R.id.table);

        // create a new TableRow
        TableRow row = new TableRow(getActivity());
        // create a new TextView for showing xml data
        TextView t = new TextView(getActivity());
        TextView n = new TextView(getActivity());
        // set the text to "text xx"
       // DataBaseHelper  R = new DataBaseHelper(getActivity());
        //R.createDataBase();
        //int x = R.getRecordsCount();
        DatabaseHandler db = new DatabaseHandler(getBaseContext());

        /**
         * CRUD Operations
         * */
        // Inserting Contacts
        Log.d("Insert: ", "Inserting ..");
        db.addContact(new Contact(94020, "I","L/PNRD TORSKFILE MSC",25956,"I2368540",23));

        // Reading all contacts
        Log.d("Reading: ", "Reading all contacts..");
        List<Contact> contacts = db.getAllContacts();

        //for (Contact cn : contacts) {
        //    String log = "Id: "+cn.getID()+" ,Name: " + cn.getID() + " ,Phone: " + cn.getPC();
            // Writing Contacts to log
        //    Log.d("Name: ", log);
        //}

        if (i == 0){
         for (Contact cn : contacts) {
           String s = String.valueOf(cn.getID());
           t.setText("s");
           t.setPadding(10,10,10,10);
           n.setText("d");
           n.setPadding(10,10,10,10);

           // add the TextView  to the new TableRow
           row.addView(t);
           row.addView(n);}}
        else{
            t.setText("!(Query 1)");
            t.setPadding(10,10,10,10);
            n.setText("Bye");
            n.setPadding(10,10,10,10);
            // add the TextView  to the new TableRow
            row.addView(t);
            row.addView(n);}


        // add the TableRow to the TableLayout

        layout.addView(row,new TableLayout.LayoutParams(TableLayout.LayoutParams.MATCH_PARENT, TableLayout.LayoutParams.WRAP_CONTENT));


        getActivity().setTitle("DataBase View Area");
        return rootView;
    }

和处理程序:

package com.example.myfirstapp;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by josephyearsley on 11/06/2013.
 */
public class DatabaseHandler extends SQLiteOpenHelper {

// All Static variables
// Database Version
private static final int DATABASE_VERSION = 1;

// Database Name
private static final String DATABASE_NAME = "contactsManager";

// Contacts table name
private static final String TABLE_CONTACTS = "contacts";

// Contacts Table Columns names
private static final String KEY_ID = "id";
private static final String KEY_PID = "pallet_id";
private static final String KEY_DESC = "description";
private static final String KEY_FREEQTY = "free_qty";
private static final String KEY_PRODCODE = "product_code";
private static final String KEY_ACCOUNT = "account";
private static final String KEY_DEPOT = "depot";


public DatabaseHandler(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

// Creating Tables
@Override
public void onCreate(SQLiteDatabase db) {
    String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "("
            + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + KEY_ACCOUNT + " INTEGER,"
            + KEY_DEPOT + " TEXT," + KEY_DESC + " TEXT,"
            + KEY_PRODCODE + " INTEGER," + KEY_PID + " TEXT,"
            + KEY_FREEQTY + " INTEGER" +
            ")";
    db.execSQL(CREATE_CONTACTS_TABLE);
}

// Upgrading database
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // Drop older table if existed
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS);

    // Create tables again
    onCreate(db);
}

/**
 * All CRUD(Create, Read, Update, Delete) Operations
 */

// Adding new contact
void addContact(Contact contact) {
    SQLiteDatabase db = this.getWritableDatabase();

    ContentValues values = new ContentValues();
    values.put(KEY_ACCOUNT, contact.getAccount()); // Contact Name
    values.put(KEY_DEPOT, contact.getDep());
    values.put(KEY_DESC, contact.getDesc());
    values.put(KEY_PRODCODE, contact.getPC());
    values.put(KEY_PID, contact.getpID());
    values.put(KEY_FREEQTY, contact.getFreeQTY());
    // Inserting Row
    db.insert(TABLE_CONTACTS, null, values);
    db.close(); // Closing database connection
}

// Getting single contact
Contact getContact(int id) {
    SQLiteDatabase db = this.getReadableDatabase();

    Cursor cursor = db.query(TABLE_CONTACTS, new String[] { KEY_ID,
            KEY_DEPOT, KEY_ACCOUNT, KEY_PRODCODE, KEY_DESC, KEY_FREEQTY, KEY_PID }, KEY_ID + "=?",
            new String[] { String.valueOf(id) }, null, null, null, null);
    if (cursor != null)
        cursor.moveToFirst();

    Contact contact = new Contact(Integer.parseInt(cursor.getString(0)),
            Integer.parseInt(cursor.getString(1)),cursor.getString(2), cursor.getString(3),
            Integer.parseInt(cursor.getString(4)),cursor.getString(5),Integer.parseInt(cursor.getString(6)));
    // return contact
    return contact;
}

// Getting All Contacts
public List<Contact> getAllContacts() {
    List<Contact> contactList = new ArrayList<Contact>();
    // Select All Query
    String selectQuery = "SELECT  * FROM " + TABLE_CONTACTS;

    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery(selectQuery, null);

    // looping through all rows and adding to list
    if (cursor.moveToFirst()) {
        do {
            Contact contact = new Contact();
            contact.setID(Integer.parseInt(cursor.getString(0)));
            contact.setAccount(Integer.parseInt(cursor.getString(1)));
            contact.setDep(cursor.getString(2));
            contact.setDesc(cursor.getString(3));
            contact.setPC(Integer.parseInt(cursor.getString(4)));
            contact.setPID(cursor.getString(5));
            contact.setFreeQTY(Integer.parseInt(cursor.getString(6)));

            // Adding contact to list
            contactList.add(contact);
        } while (cursor.moveToNext());
    }

    // return contact list
    return contactList;
}

// Updating single contact
public int updateContact(Contact contact) {
    SQLiteDatabase db = this.getWritableDatabase();

    ContentValues values = new ContentValues();
    values.put(KEY_ACCOUNT, contact.getAccount());
    values.put(KEY_DEPOT, contact.getDep());
    values.put(KEY_DESC, contact.getDesc());
    values.put(KEY_PRODCODE, contact.getPC());
    values.put(KEY_PID, contact.getpID());
    values.put(KEY_FREEQTY, contact.getFreeQTY());

    // updating row
    return db.update(TABLE_CONTACTS, values, KEY_ID + " = ?",
            new String[] { String.valueOf(contact.getID()) });
}

// Deleting single contact
public void deleteContact(Contact contact) {
    SQLiteDatabase db = this.getWritableDatabase();
    db.delete(TABLE_CONTACTS, KEY_ID + " = ?",
            new String[] { String.valueOf(contact.getID()) });
    db.close();
}


// Getting contacts Count
public int getContactsCount() {
    String countQuery = "SELECT  * FROM " + TABLE_CONTACTS;
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery(countQuery, null);
    cursor.close();

    // return count
    return cursor.getCount();
}

}

和 CRUD:

    package com.example.myfirstapp;

/**
* Created by josephyearsley on 11/06/2013.
*/
public class Contact {

//private variables
int _id;
String _palletID;
int _freeQty;
String _description;
int _product_code;
int _account;
String _depot;


// Empty constructor
public Contact(){

}
// constructor
public Contact(int id,int account,String depot, String description,int pc,String pID,int freeQty ){
    this._account = account;
    this._palletID = pID;
    this._freeQty = freeQty;
    this._description=description;
    this._product_code = pc;
    this._depot = depot;
    this._id = id;

}

// constructor
public Contact(int account,String depot, String description,int pc,String pID,int freeQty ){
    this._account = account;
    this._palletID = pID;
    this._freeQty = freeQty;
    this._description=description;
    this._product_code = pc;
    this._depot = depot;

}
// getting ID
public int getID(){
    return this._id;
}

// setting id
public void setID(int id){
    this._id = id;
}

// getting name
public int getPC(){
    return this._product_code;
}

// setting name
public void setPC(int pc){
    this._product_code = pc;
}
// getting name
public int getAccount(){
    return this._account;
}

// setting name
public void setAccount(int account){
    this._account = account;
}

// getting name
public String getpID(){
    return this._palletID;
}

// setting name
public void setPID(String Pallet){
    this._palletID = Pallet;
}

// getting name
public int getFreeQTY(){
    return this._freeQty;
}

// setting name
public void setFreeQTY(int freeQTY){
    this._freeQty = freeQTY;
}
// getting phone number
public String getDesc(){
    return this._description;
}

// setting phone number
public void setDesc(String Desc){
    this._description = Desc;
}
// getting phone number
public String getDep(){
    return this._depot;
}

// setting phone number
public void setDep(String Dep){
    this._depot = Dep;
}
}

基本上,我很困惑为什么它告诉我从其父视图中删除视图,因为我试图循环返回的列表,将行中的值插入表中。有人可以解释为什么我的代码不起作用以及如何修复它或更好的标准,因为我是 android 编程新手。

4

1 回答 1

0

有人可以解释为什么我的代码不起作用

您在循环外创建nt TextView小部件,然后重复调用以将它们添加到循环的行中。因此,在循环的第二遍中,子级已经有了父级(来自循环第一遍中的调用),并且您得到了异常。addView()addView()

假设循环本身在其他方面是正确的(并且这与您所需的 UI 和业务逻辑更相关),您需要TextView在循环的每次传递中创建新的小部件。

于 2013-06-11T16:19:49.287 回答