2016-03-21 2 views
0

Моя программа отображает горизонтально раздвигающийся ряд кнопок, содержащих текстовое описание произведения искусства. Когда нажимается кнопка, ImageActivity запускает, чтобы отобразить соответствующее произведение искусства. Однако, когда я нажимаю любую текстовую кнопку, она всегда отображает самую последнюю картину в массиве.Правильное целое число не передается через PutExtra

Я пытаюсь передать идентификатор int второму действию, чтобы он отображал правильную картину, как только ее соответствующее описание будет нажато.

Спасибо!

Вот мой MainActivity:

import android.content.Intent; 
import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.LinearLayout; 

public class MainActivity extends Activity { 

    //CONTAINING PAINTINGS 
    private LinearLayout mLinearList; 
    private String id; 
    private Painting painting; 

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

     //REFERENCE THE SCROLLABLE LAYOUT STRUCTURE IN MAIN_SCREEN.XML 
     mLinearList = (LinearLayout) findViewById(R.id.linearList); 

     //FILL THE SCROLLABLE LAYOUT STRUCTURE WITH PAINTINGS 
     fillTextCarousel(); 

    } 

    private void fillTextCarousel() { 

     // POPULATE THE LINEAR LIST CAROUSEL WITH PAINTINGS AND DESCRIPTIONS 
     Button buttonItem; 

     for (int i = 0; i < RenaissanceDatabase.description.length; i++) { 
      //STORE THE INDIVIDUAL PAINTINGS AS BUTTONS 
      buttonItem = new Button(this); 


      painting = new Painting(RenaissanceDatabase.description[i], RenaissanceDatabase.id[i]); 

      //USE THE CONTENT DESCRIPTION PROPERTY TO STORE 
      //PAINTING DATA 

      buttonItem.setContentDescription(painting.getDescription()); 
      buttonItem.setText(painting.getDescription()); 

      //SET AN ONCLICK LISTENER FOR THE TEXT BUTTON 
      buttonItem.setOnClickListener(displayPainting); 

      //ADD THE IMAGE BUTTON TO THE SCROLLABLE LINEAR LIST 
      mLinearList.addView(buttonItem); 
     } 
    } 

    private View.OnClickListener displayPainting = new View.OnClickListener() { 
     public void onClick(View btn) { 
     // COLLECT THE IMAGE STORED FOR THE PAINTING 
      //String Painting_ID = Integer.toString(painting.getId()); 
      Intent imgIntent = new Intent(getApplicationContext(), ImageActivity.class); 
      imgIntent.setAction(imgIntent.ACTION_SEND); 
      imgIntent.putExtra("image_id", painting.getId()); 
      startActivity(imgIntent); 

     } 
    }; 

Моего ImageActivity, что я пытаюсь передать целочисленный идентификатор:

public class ImageActivity extends Activity { 

private Painting painting; 
private int index; 
private int[] IDs; 
private String[] Desc; 

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

    Intent objIntent = getIntent(); 
    int ID_Val = objIntent.getIntExtra("image_id", 0); 
    ImageView art = (ImageView) findViewById(R.id.imageView2); 
    art.setImageResource(ID_Val); 
} 

}

и базу данных картины, которую я везу взятие идентификатора от:

public class RenaissanceDatabase { 

    public static String description[] = { 
      "Venus of Urbino\nTitan, 1538", 
      "St. John the Baptist\nLeonardo da Vinci, 1516", 
      "Protrait of Baldassare Castiglione\nRaphael, 1515", 
      "The Entombent of Christ\nCaravaggio, 1603", 
      "Coronation of the Virgin\nFra Angelico, 1435", 
      "Mars and Venus\n Sandro Bottcelli, 1483"}; 

    public static int id[] = { 
      R.drawable.painting1, // VENUS OF URBINO 
      R.drawable.painting2, // ST.JOHN BAPTIST 
      R.drawable.painting3, // BALDASSARE 
      R.drawable.painting4, // ENTOMBENT OF CHRIST 
      R.drawable.painting5, // CORONOATION 
      R.drawable.painting6 // MARS AND VENUS 
    }; 
} 
+0

вы получите ответ на заданный вами вопрос, но вы действительно должны использовать ViewPager, чтобы ваши просмотры стали перерабатываться. – CQM

ответ

1

Установите id для каждого button в вашей цикл -

for (int i = 0; i < RenaissanceDatabase.description.length; i++) { 
      //STORE THE INDIVIDUAL PAINTINGS AS BUTTONS 
      buttonItem = new Button(this); 


      painting = new Painting(RenaissanceDatabase.description[i], RenaissanceDatabase.id[i]); 

      //USE THE CONTENT DESCRIPTION PROPERTY TO STORE 
      //PAINTING DATA 

      buttonItem.setId(painting.getId()); 
.... 
     } 
    } 

А затем измените OnClickListener -

private View.OnClickListener displayPainting = new View.OnClickListener() { 
     public void onClick(View btn) { 
    .... 
      imgIntent.putExtra("image_id", btn.getId()); 
      startActivity(imgIntent); 

     } 
    }; 
+0

Это так очевидно сейчас - большое вам спасибо! Как сказал Натаниэль Д. Вагонер, я не обновлял текущую картину. – Freckles

+0

Тот, кто имеет нисходящее направление - Можете ли вы объяснить причину этого? –

1

Путь ваш код настроенное это имеет смысл.

Посмотрите на цикл, который вы используете, чтобы настроить все.

for (int i = 0; i < RenaissanceDatabase.description.length; i++) { 
..... 
    painting = new Painting(RenaissanceDatabase.description[i], RenaissanceDatabase.id[i]); 
... 
} 

Какова ценность рисунка в конце этого цикла? Это то, что было в последней позиции в массиве.

Теперь посмотрим на код, чтобы передать ID:

private View.OnClickListener displayPainting = new View.OnClickListener() { 
    public void onClick(View btn) { 
     .... 
     imgIntent.putExtra("image_id", painting.getId()); 
     ..... 
    } 
}; 

код не представлено и не обновляет «текущую картину» к той, которая затрагивалась. Вам нужно выяснить, какую живопись коснулся пользователь, и использовать идентификатор этой картины.

В другом ответе есть рекомендация установить кнопкуId на идентификатор картины - у этого есть некоторые проблемы, поэтому я лично не рекомендовал бы этого.

Вместо этого я бы использовал шаблон адаптера и шаблона ViewHolder и использовал его для хранения этих метаданных. Это гораздо более масштабируемое решение.

+1

Аргай! Спасибо! Я рассматривал эту проблему последние пару часов и не понимал, что на самом деле я не обновляю идентификатор на основе нажатой кнопки. Спасибо, что нашли время, чтобы пройти через это для меня: / – Freckles

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