2012-10-30 82 views
1

我正在创建一个小应用程序,您可以在其中通过按钮单击来添加或删除表格行。每当我点击“添加行”按钮时,该按钮将添加一个表格行到布局,并做它应该做的事情。但是,“删除行”不会删除新添加的表格行,但它确实会减少(int count)。我已经工作了4到5个小时,现在我没有运气。这里的代码:无法从布局中删除视图

int count = 0; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState);  
    setContentView(R.layout.activity_main); 
    Button buttonAdd = (Button) findViewById(R.id.button1); 
    Button buttonDel = (Button) findViewById(R.id.button2); 
    buttonAdd.setOnClickListener(this); 
    buttonDel.setOnClickListener(this); 
} 



public void onClick(View v) { 
    TableLayout tableLayout1; 
    EditText editText1; 
    EditText editText2; 
    TableRow tempRow; 
    EditText tempText1; 
    EditText tempText2; 
    TableRow tableRow1; 

    tableLayout1 = (TableLayout) findViewById(R.id.tableLayout1); 
    editText1 = (EditText) findViewById(R.id.editText1); 
    editText2 = (EditText) findViewById(R.id.editText2); 
    tempRow = new TableRow(MainActivity.this); 
    tempText1 = new EditText(MainActivity.this); 
    tempText2 = new EditText(MainActivity.this); 
    tempText1.setInputType(InputType.TYPE_CLASS_TEXT); 
    tempText2.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL); 
    tableRow1 = (TableRow) findViewById(R.id.tableRow1); 

    tempRow.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); 
    tempText1.setLayoutParams(editText1.getLayoutParams()); 
    tempText2.setLayoutParams(editText2.getLayoutParams()); 
    switch(v.getId()){ 
    case R.id.button1: 
     if(count != 9){ 
      count++; 

      tempRow.addView(tempText1); 
      tempRow.addView(tempText2); 
      tableLayout1.addView(tempRow); 
     } else { 
      final AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create(); //Read Update 
      alertDialog.setTitle("Error"); 
      alertDialog.setMessage("You can only have 10 rows!"); 

      alertDialog.setButton("Ok", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        alertDialog.dismiss(); 
       } 
      }); 

      alertDialog.show(); 
     } 
     break; 
    case R.id.button2: 
     if(count != 0){ 
      count--; 
      tempRow.removeView(tempText1); 
      tempRow.removeView(tempText2); 
      tableLayout1.removeView(tempRow); 
      //tableLayout1.invalidate(); 

     } else { 
      final AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create(); //Read Update 
      alertDialog.setTitle("Error"); 
      alertDialog.setMessage("You must have at least one row!"); 

      alertDialog.setButton("Ok", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        alertDialog.dismiss(); 
       } 
      }); 

      alertDialog.show(); 
     } 
     break; 
     default: 
      //Do something; 
    } 

}  

10-30 21:22:23.379: E/AndroidRuntime(3970): FATAL EXCEPTION: main 
10-30 21:22:23.379: E/AndroidRuntime(3970): java.lang.NullPointerException 
10-30 21:22:23.379: E/AndroidRuntime(3970): at com.android.hopegpacalc.MainActivity.onClick(MainActivity.java:57) 
10-30 21:22:23.379: E/AndroidRuntime(3970): at android.view.View.performClick(View.java:3511) 
10-30 21:22:23.379: E/AndroidRuntime(3970): at android.view.View$PerformClick.run(View.java:14105) 
10-30 21:22:23.379: E/AndroidRuntime(3970): at android.os.Handler.handleCallback(Handler.java:605) 
10-30 21:22:23.379: E/AndroidRuntime(3970): at android.os.Handler.dispatchMessage(Handler.java:92) 
10-30 21:22:23.379: E/AndroidRuntime(3970): at android.os.Looper.loop(Looper.java:137) 
10-30 21:22:23.379: E/AndroidRuntime(3970): at android.app.ActivityThread.main(ActivityThread.java:4424) 
10-30 21:22:23.379: E/AndroidRuntime(3970): at java.lang.reflect.Method.invokeNative(Native Method) 
10-30 21:22:23.379: E/AndroidRuntime(3970): at java.lang.reflect.Method.invoke(Method.java:511) 
10-30 21:22:23.379: E/AndroidRuntime(3970): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
10-30 21:22:23.379: E/AndroidRuntime(3970): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
10-30 21:22:23.379: E/AndroidRuntime(3970): at dalvik.system.NativeStart.main(Native Method) 

回答

2

这是组织的问题,试试这个:

public void onClick(View v) { 
    // These should be class variables, like count, you don't need to re-find it on every click 
    TableLayout tableLayout1 = (TableLayout) findViewById(R.id.tableLayout1); 
    EditText editText1 = (EditText) findViewById(R.id.editText1); 
    EditText editText2 = (EditText) findViewById(R.id.editText2); 

    switch(v.getId()){ 
    case R.id.button1: 
     if(count != 9){ 
      count++; 

      // Create the row only when the add button is clicked 
      TableRow tempRow = new TableRow(MainActivity.this); 
      EditText tempText1 = new EditText(MainActivity.this); 
      EditText tempText2 = new EditText(MainActivity.this); 
      tempText1.setInputType(InputType.TYPE_CLASS_TEXT); 
      tempText2.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL); 

      tempRow.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); 
      tempText1.setLayoutParams(editText1.getLayoutParams()); 
      tempText2.setLayoutParams(editText2.getLayoutParams()); 

      tempRow.addView(tempText1); 
      tempRow.addView(tempText2); 
      tableLayout1.addView(tempRow); 
     } else { 
      // Consider using Activity's showDialog() method, to reuse this "error" dialog rather than create a new one every time 
      final AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create(); //Read Update 
      alertDialog.setTitle("Error"); 
      alertDialog.setMessage("You can only have 10 rows!"); 

      alertDialog.setButton("Ok", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        alertDialog.dismiss(); 
       } 
      }); 

      alertDialog.show(); 
     } 
     break; 
    case R.id.button2: 
     if(count != 0){ 
      // Remove the last row at count or use "tableLayout1.getChildCount() - 1" 
      tableLayout1.removeView(tableLayout1.getChildAt(count)); 
      count--; 
     } else { 
      // Consider reusing the other "error" Dialog and simply changing the message 
      final AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create(); //Read Update 
      alertDialog.setTitle("Error"); 
      alertDialog.setMessage("You must have at least one row!"); 

      alertDialog.setButton("Ok", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        alertDialog.dismiss(); 
       } 
      }); 

      alertDialog.show(); 
     } 
     break; 
    default: 
     //Do something; 
    } 
} 
+0

你先生是个天才。谢谢!我现在遇到的唯一问题是,在添加一行后,删除该行,然后尝试再次添加一行,在行57上收到一个NullPointerException。它将这个异常指向“tempText1.setLayoutParams(editText1.getLayoutParams());” – user1460211

+0

这很奇怪,可以编辑所有的LogCat错误到你的问题?所以我可以看到发生了什么。 – Sam

+0

我可能已经排除了错误的行,试试这个 – Sam

0

每次onClick执行时,您的代码都会生成一个新的TableRow。您只应在添加一行时执行此操作。如果要删除一个,则必须使用findViewById(id)在现有视图中找到要删除的行,然后在该对象上运行removeView

​​

这并不意味着你必须设置在创建它的每个表行的ID,使用setId,并跟踪它。

0

你移除代码为“删除”临时视图(如tempText1),实际上是没有在表中 - 他们提出了在飞行中onClick方法。除非在进入onClick后立即实例化所有这些对象,否则请在每个switch语句的主体中执行此操作。对于添加按钮,只需复制并粘贴即可。对于删除人员,请将这些对象设置为与要删除的行相同。

看起来您似乎没有办法选择要删除的行,但假设您在其他位置执行此操作,则可以使用TableLayout.removeViewAt(int index)来选择哪一行。如果你有视图本身而不是索引,也有TableLayout.removeView(View view)