2016-03-21 3 views
0

Mein Programm zeigt eine horizontal verschiebbare Zeile mit Schaltflächen an, die die Textbeschreibung eines Kunstwerks enthält. Wenn auf eine Schaltfläche geklickt wird, wird ImageActivity gestartet, um das entsprechende Kunstwerk anzuzeigen. Wenn ich jedoch auf eine der Textschaltflächen klicke, wird immer das allerletzte Bild im Array angezeigt.Korrekte Ganzzahl, die nicht übergeben wird PutExtra

Ich versuche, eine Int-ID an eine zweite Aktivität zu übergeben, so dass es das richtige Gemälde anzeigen wird, sobald auf die entsprechende Beschreibung geklickt wird.

Vielen Dank!

Hier ist meine 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); 

     } 
    }; 

Mein ImageActivity, dass ich eine ganze Zahl ID passieren zu versuche:

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); 
} 

}

Und das Gemälde Datenbank, die ich mit der Einnahme bin ID:

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

Sie erhalten eine Antwort auf die Frage, die Sie gestellt haben, aber Sie sollten wirklich einen ViewPager verwenden, damit Ihre Ansichten recycelt werden – CQM

Antwort

1

Stellen Sie die id für jeden button in Ihrer for-Schleife -

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()); 
.... 
     } 
    } 

Und dann ändern OnClickListener -

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

     } 
    }; 
+0

Es ist jetzt so offensichtlich - vielen Dank! Wie Nathaniel D. Wagoner sagte, habe ich das aktuelle Gemälde nicht aktualisiert. – Freckles

+0

Wer auch immer runtergeregelt hat - Kannst du das begründen? –

1

Die Art und Weise wird der Code dies macht Sinn eingerichtet.

Sehen Sie sich die Schleife an, mit der Sie alles konfigurieren.

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

Welchen Wert hat das Malen am Ende dieser Schleife? Es ist, was auch immer in der letzten Position im Array war.

Sehen Sie sich jetzt Ihr Code die ID zu übergeben:

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

ist der Code nie aktualisiert die „aktuelle Malerei“ der, die berührt wurde. Sie müssen herausfinden, welches Bild der Benutzer berührt hat und die ID dieses Gemäldes verwenden.

Eine andere Antwort hat eine Empfehlung, die buttonId auf die ID des Gemäldes zu setzen - das hat einige Probleme, also würde ich das persönlich nicht empfehlen.

Stattdessen würde ich ein Adapter- und ViewHolder-Muster verwenden und den Viewholder nutzen, um diese Metadaten zu enthalten. Dies ist eine viel besser skalierbare Lösung.

+1

Arrgh! Vielen Dank! Ich habe in den letzten paar Stunden auf dieses Problem gestarrt und war mir nicht bewusst, dass ich die ID nicht basierend auf dem angeklickten Button aktualisiere. Danke, dass Sie sich die Zeit genommen haben, für mich durchzulaufen: – Freckles

Verwandte Themen