2013-12-09 5 views
2

У меня есть 10 кнопок, и я хочу установить OnClickListener для всех этих кнопок. Также при нажатии на любое приложение кнопки будет выполняться другое действие. Я публикую только определения кнопок в классе активности. Мой код;Кнопка setOnClickListener on for loop

Button button1 = (Button) findViewById(R.id.button1); 
Button button2 = (Button) findViewById(R.id.button2); 
Button button3 = (Button) findViewById(R.id.button3); 
Button button4 = (Button) findViewById(R.id.button4); 
Button button5 = (Button) findViewById(R.id.button5); 
Button button6 = (Button) findViewById(R.id.button6); 
Button button7 = (Button) findViewById(R.id.button7); 
Button button8 = (Button) findViewById(R.id.button8); 
Button button9 = (Button) findViewById(R.id.button9); 
Button button10 = (Button) findViewById(R.id.button10); 
Button buttons[] = {button1, button2, button3, button4, button5, button6, button7, button8, button9, button10}; 
final String urlOfButtons[] = {"","","","","","","","","","",""}; 
final String titles[] = {"","","","","","","","","","",""}; 

JsonNode itemNode = jsonNode.path("Docs"); 
for(int i=0 ; i<itemNode.size() ; i++){ 
    titles[i] = itemNode.get(i).path("Text").asText(); 
      title = titles[i]; 
    buttons[i].setText(title); 
    urlOfButtons[i] = itemNode.get(i).path("Link").asText(); 
      url = urlOfButtons[i]; 
    buttons[i].setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      Intent intent = new Intent(HouseDetail.this, HouseDetailPdf.class); 
      intent.putExtra("title", title); 
      intent.putExtra("url", url); 
      startActivity(intent); 
     } 
    }); 
} 

Это относится только к последним значениям заголовка и URL-адреса. Строковый url, заголовок определяется поверх класса. Каждая кнопка, которую я нажимаю на то же значение, переходит в другую активность. Я хочу добавить 10 дополнительных значений. Поэтому я хочу добавить вместо заголовка и URL-адреса; заголовки [i] и url [i] как дополнительные. Надеюсь, я поняла.

+0

Вы добавляете эти кнопки программно или в свой xml-макет? –

+0

Я добавляю эти кнопки по расположению, конечно. –

ответ

3

Вы можете установить title и url как тег для каждой кнопки

buttons[i].setTag(1, title); 
buttons[i].setTag(2, url); 

и rerieve тег внутри onClick

@Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      Intent intent = new Intent(HouseDetail.this, HouseDetailPdf.class); 
      intent.putExtra("title", v.getTag(1)); 
      intent.putExtra("url", v.getTag(2)); 
      startActivity(intent); 
     } 

Или же вы можете сделать что-то вроде this.Store index как тег, так что вы можете получить index когда button нажата.

buttons[i].setTag(i); 

Получить index, который хранится в tag.

@Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      int position = Integer.parseInt(v.getTag().toString()); 
      Intent intent = new Intent(HouseDetail.this, HouseDetailPdf.class); 
      intent.putExtra("title", titles[position]); 
      intent.putExtra("url", urlOfButtons[position]); 
      startActivity(intent); 
     } 
+0

Я использовал верхний. Очень полезная идея, я никогда не забуду этот путь :) –

+0

Я верю, второе решение лучше первого, так как оно экономит небольшую память :) –

+0

Я тоже попробую :) –

3

Попробуйте это ..

Вы прошли значения title и url к следующей деятельности. Но в конце for looptitle и url будут иметь только последнее значение цикла for. Поэтому, независимо от button click, только последние сохраненные значения в title и url перейдут только к следующему действию.

Вы можете использовать setTag(int key, Object tag) и установите значения url и title для button как теги внутри for loop, и вы можете получить их в button мыши, используя метод getTag(int key) ..

JsonNode itemNode = jsonNode.path("Docs"); 
for(int i=0 ; i<itemNode.size() ; i++){ 
    titles[i] = itemNode.get(i).path("Text").asText(); 
      title = titles[i]; 
    buttons[i].setText(title); 

    urlOfButtons[i] = itemNode.get(i).path("Link").asText(); 
      url = urlOfButtons[i]; 

    buttons[i].setTag(1,title); 
    buttons[i].setTag(2,url); 

    buttons[i].setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      Intent intent = new Intent(HouseDetail.this, HouseDetailPdf.class); 
      intent.putExtra("title", v.getTag(1)); 
      intent.putExtra("url", v.getTag(2)); 
      startActivity(intent); 
     } 
    }); 
} 

setTag(int key, Object tag);

getTag(int key);

+0

Я пробовал, но значения i не могут быть символическими на onclicklistener. –

+0

Изменить модификатор 'i' на окончательный. Eclipse дает это предложение. –

+0

Я не уверен, что это правильно. К тому времени, когда вызывается 'onClick', цикл' for' запускается до завершения, и 'i' всегда будет равен' itemNode.size() '(это если вы можете заставить компилятор разрешить его, что я сомневаюсь - java имеет правило синтаксиса, которое хмурится этим делом) – Iain

0

Вы можете получить соответствующие title и url на каждой итерации цикла и сохраните их в чем-то окончательном, то вы можете использовать их в onClickListener.

for(int i=0 ; i<itemNode.size() ; i++){ 
    final String title = itemNode.get(i).path("Text").asText(); 
    final String url = itemNode.get(i).path("Link").asText(); 
    buttons[i].setOnClickListener(/* same as you had before */); 
} 

(предупреждение: непроверенный код).

Очевидно, что если вы используете заголовки и массивы URL-адресов в другом месте, вы должны также присвоить значения.

+0

Также мне нужно изменить модификатор 'int i' на final? Тогда как насчет i ++ для цикла? –

+0

Нет. Вам нужно только «i» быть окончательным, если вы ссылаетесь на него изнутри тела «OnClickListener». В коде, который я предложил, для каждой итерации цикла мы создаем новую переменную 'title' и новую переменную' url', которые основаны на 'i'. Затем каждый раз мы строим новый 'OnClickListener', который зависит от' title' и 'url'. Поэтому 'i' может изменять и отслеживать цикл, а' title' и 'url' неизменны с точки зрения каждого' OnClickListener' – Iain

+0

. Ответ @abhishek V лучше, чем это, хотя - почему 10 'OnClickListener' когда вы это сделаете? – Iain

0

Ваш класс должен реализовывать onclickListner так:

public class HomeScreen extends Activity implements OnClickListener 

Инициализировать ваши кнопки:

Button button1 = (Button) findViewById(R.id.button1); 
button1.setOnClickListener(this); 
Button button2 = (Button) findViewById(R.id.button2); 
button2.setOnClickListener(this); 
Button button3 = (Button) findViewById(R.id.button3); 
button3.setOnClickListener(this); 
Button button4 = (Button) findViewById(R.id.button4); 
butto4.setOnClickListener(this); 

Ручка пункта щелчка для всех кнопок:

public void onClick(View v) { 
     switch (v.getId()) {   
     case R.id.button1: 
      Intent intent = new Intent(HouseDetail.this, HouseDetailPdf.class); 
      intent.putExtra("title", title); 
      intent.putExtra("url", url); 
startActivity(intent); 
      break; 
     case R.id.button2: 
       Intent intent = new Intent(HouseDetail.this, HouseDetailPdf.class); 
      intent.putExtra("title", title); 
      intent.putExtra("url", url); 
startActivity(intent); 
      break; 
     case R.id.button3: 
       Intent intent = new Intent(HouseDetail.this, HouseDetailPdf.class); 
      intent.putExtra("title", title); 
      intent.putExtra("url", url); 
startActivity(intent); 
      break; 
     case R.id.button4: 
       Intent intent = new Intent(HouseDetail.this, HouseDetailPdf.class); 
      intent.putExtra("title", title); 
      intent.putExtra("url", url); 
startActivity(intent); 
      break; 
     } 
0

Хороший способ избежать этого цикла. Просто определите url и заголовок в XML-файле.

вы могли бы поставить это в определении кнопки:

android:tag="title|url" 

, а затем, в onClickListener вы должны поставить:

 @Override 
     public void onClick(View v) { 
      if(v.getTag() != null){ 
         String[] details = v.getTag().split("|"); 
         Intent intent = new Intent(HouseDetail.this, HouseDetailPdf.class); 
         intent.putExtra("title", details[0]); 
         intent.putExtra("url", details[1]); 
         startActivity(intent); 
      } 
     } 
    }); 

И тогда, петля только может быть использован для setOnClickButtonListener (слушатель); Но, конечно, вы должны определить этот слушатель как код выше.