2015-12-15 2 views
0

Это пример кода для проверки. Я добавляю checkbox и textview в строку таблицы, используя цикл. Все работает нормально, за исключением того, что всякий раз, когда я пытаюсь извлечь (checkBox, Textview) из другого метода, я не могу его получить. Я не знаю, как это решить. Я попробовал setId, но я не смог получить идентификатор.Получение идентификатора из программного представления

protected void onCreate(Bundle savedInstanceState) { 
    TableLayout tl = (TableLayout)findViewById(R.id.tableLayout1); 
    TableRow[] row = new TableRow[5]; 
    TextView tv[] = new TextView[5]; 
    CheckBox[] cb = new CheckBox[5]; 
    Button clickTestRow; 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 



    for(int j = 0; j < 5; j ++){ 
     row[j] = new TableRow(this); 
     tl.addView(row[j]); 
     tv[j] = new TextView(this); 
     cb[j] = new CheckBox(this); 

     tv[j].setText("This is text"); 

     row[j].addView(cb[j]); 
     row[j].addView(tv[j]); 

     if(j == 0) 
      cb[j].setChecked(true); 

    } 

    clickTestRow = (Button) findViewById(R.id.clickTestRow); 

    clickTestRow.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
    TableLayout tlid = (TableLayout) findViewById(R.id.tableLayout1); 
      for(int i = 0; i < 5; i ++){ 
       if(cb[i].isChecked()){ 
        tlid.removeView(row[i]); 
       } 
      } 
     } 
    }); 
+0

Вы должны переместить 'TableLayout tl' в поле в верхней части вашего класса. Затем вы можете использовать эту переменную внутри вашего onClickListener. –

+0

Если я переведу его сверху, тогда я получу NPE, который я не знаю почему, но этот способ, похоже, исправить. – user3900009

+0

Вам все равно нужно будет сделать tl = (TableLayout) findViewById (R.id.tableLayout1); '. –

ответ

0

Это не проверено, но попробуйте это сейчас.

Ключевые моменты здесь

  1. Поля для просмотров
  2. Вызов setContentViewперед тем использованием findViewById
  3. final переменные для тех, которые вы пытаетесь использовать в качестве анонимного класса (onClickListener)

public class MainActivity extends Activity { 

    private TableLayout tl; 
    private Button clickTestRow; 

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

     tl = (TableLayout)findViewById(R.id.tableLayout1); 
     clickTestRow = (Button) findViewById(R.id.clickTestRow); 

     final TableRow[] row = new TableRow[5]; 
     final TextView tv[] = new TextView[5]; 
     final CheckBox[] cb = new CheckBox[5]; 

     for(int j = 0; j < 5; j ++){ 
      row[j] = new TableRow(this); 
      tl.addView(row[j]); 
      tv[j] = new TextView(this); 
      cb[j] = new CheckBox(this); 

      tv[j].setText("This is text"); 

      row[j].addView(cb[j]); 
      row[j].addView(tv[j]); 
     } 
     cb[0].setChecked(true); 

     clickTestRow.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       for(int i = 0; i < 5; i ++){ 
        if(cb[i].isChecked()){ 
         tl.removeView(row[i]); 
        } 
       } 
      } 
     }); 
    } 
} 
+0

Теперь я понимаю, что вы имеете в виду. Итак, добавив окончательное решение всего? – user3900009

+0

В данном случае да. Вы также можете переместить массивы в поля и достичь той же цели. –

+0

большое вам спасибо. Мне трудно найти способы получить идентификатор – user3900009

Смежные вопросы