2015-01-11 267 views
1

我想通過按下子視圖內的按鈕,但代碼不起作用來添加子視圖到主視圖。任何想法是什麼問題。我是Android初學者將子視圖添加到子視圖中的按鈕的主視圖 - android

這是主要的線性佈局,其子線形佈局符合+和 - 按鈕添加到它。我想通過按+添加另一行,並通過按 - 將其刪除。 enter image description here

這裏是主要的佈局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/trainer_main" 
android:layout_width="768dp" 
android:layout_height="1280dp" 
android:background="#121617" 
android:orientation="vertical" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
tools:context=".TrainingProgrammer" > 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:paddingBottom="25dip" 
    android:textColor="#ffffff" 
    android:textStyle="bold" 
    android:text="@string/title_activity_training_programmer" /> 

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

    <TextView 
     android:id="@+id/interval_title" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textColor="#ffffff" 
     android:text="@string/training_programmer_interval" /> 

    <TextView 
     android:id="@+id/exercise_title" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:paddingLeft="10dip" 
     android:paddingRight="95dip" 
     android:textColor="#ffffff" 
     android:text="@string/training_programmer_exercise" /> 

    <TextView 
     android:id="@+id/second_title" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:paddingRight="25dip" 
     android:textColor="#ffffff" 
     android:text="@string/training_programmer_time" /> 

    <TextView 
     android:id="@+id/weight_title" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:paddingRight="10dip" 
     android:textColor="#ffffff" 
     android:text="@string/training_programmer_weight" /> 

</LinearLayout> 

,這裏是孩子佈局

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/trainer_progcontent" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:orientation="horizontal" > 


<TextView 
    android:id="@+id/interval_content" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textColor="#ffffff" 
    android:textSize="14sp" 
    android:ems="1" 
    android:text="1" /> 

<EditText 
    android:id="@+id/exercise_content" 
    android:layout_width="127dp" 
    android:layout_height="wrap_content" 
    android:textSize="14sp" 
    android:singleLine="true" 
    android:textColor="#ffffff" 
    android:hint="@string/training_programmer_exercise_edit" 
    android:ems="10" /> 

<EditText 
    android:id="@+id/time_content" 
    android:layout_width="45dp" 
    android:layout_height="wrap_content" 
    android:hint="@string/training_programmer_time_edit" 
    android:inputType="number" 
    android:maxLength="2" 
    android:textColor="#ffffff" /> 

<EditText 
    android:id="@+id/weight_content" 
    android:layout_width="45dp" 
    android:layout_height="wrap_content" 
    android:hint="@string/training_programmer_weight_edit" 
    android:inputType="number" 
    android:maxLength="2" 
    android:textColor="#ffffff" /> 

<Button 
    android:id="@+id/button_minus" 
    style="?android:attr/buttonStyleSmall" 
    android:layout_width="30dp" 
    android:layout_height="30dp" 
    android:layout_marginLeft="20dp" 
    android:background="@drawable/minus2" /> 

<Button 
    android:id="@+id/button_plus" 
    style="?android:attr/buttonStyleSmall" 
    android:layout_width="30dp" 
    android:layout_height="30dp" 
    android:layout_marginLeft="20dp" 
    android:background="@drawable/plus2" /> 

這裏是代碼:

package ca.cruxtec.cruxtectrainer; 

import android.support.v7.app.ActionBarActivity; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.Button; 
import android.widget.LinearLayout; 
import android.widget.Toast; 


public class ProgrammerActivity extends ActionBarActivity { 

private Button button_plus_define; 
private Button button_minus_define; 

static private final int MAX_NO_EXER = 30; 
private int i = 1; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_programmer); 

    final LinearLayout programmer_main_layout = (LinearLayout)findViewById(R.id.trainer_main); 
    //LinearLayout sequence_layout = (LinearLayout)findViewById(R.id.trainer_progcontent); 

    // Layout inflation for addition of the child view to the main view 
    final View adding_child = getLayoutInflater(). 
    inflate(R.layout.sequence, programmer_main_layout, false); 
    programmer_main_layout.addView(adding_child); 

    // Plus button 
    button_plus_define = (Button)findViewById(R.id.button_plus); 
    button_plus_define.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View arg0) { 
      i++; 
      programmer_main_layout.addView(adding_child); 

      /* Toast.makeText(getApplicationContext(), 
        "i is :" + i, Toast.LENGTH_LONG).show();*/ 
     } 
    }); 

    // minus button 
    button_minus_define = (Button)findViewById(R.id.button_minus); 
    button_minus_define.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View arg0) { 
      /*if(i>2) i--; 
      else { 

       Toast.makeText(getApplicationContext(), 
         "i is less than 2:" , Toast.LENGTH_LONG).show(); 

      } 
      Toast.makeText(getApplicationContext(), 
        "i is :" +i , Toast.LENGTH_LONG).show();*/ 

     } 
    }); 



} 


@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_programmer, menu); 
    return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

     return super.onOptionsItemSelected(item); 
} 
} 

應用程序崩潰是由於其

programmer_main_layout.addView(adding_child); 

+按鈕

這裏裏面的主要錯誤:

30799-30799/ca.cruxtec.cruxtectrainer E/AndroidRuntime﹕ FATAL EXCEPTION: main 
java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 
+0

嘗試添加此代碼onclick()function.View adding_child = getLayoutInflater()。 inflate(R.layout.sequence,programmer_main_layout,false); programmer_main_layout.addView(adding_child); –

+0

謝謝,現在加號按鈕只在頂行上按下時才添加行。我希望能夠通過按最後一個(最低)加號按鈕來做到這一點。現在我正在考慮更改子佈局,並刪除每行上的+和 - ,並將它放在頂行以添加/扣除行 – user4298456

回答

2

每次添加一個視圖的孩子另一種觀點,它應該是一個更新的。但是你每次添加相同的參考「adds_child」。 我希望你明白爲什麼錯誤「指定的孩子已經有父母」發生了。

+0

您是否可以更清楚地瞭解如何在每次添加新子視圖時加?我正在嘗試更改計數器的行號,因爲我按下按鈕,並且添加的子視圖保持不了我的方向,除了頂部的第一個添加的子視圖 – user4298456

+0

也許我需要爲每個新創建的子視圖創建一個數組? – user4298456

+0

實際上你並不需要,因爲一旦你將一個孩子添加到parent.You可以在將來使用getChildAt(index)method.getChildCount()將孩子的所有孩子引用。 –

相關問題