2016-03-21 8 views
0

私のプログラムは、アートワークのテキスト記述を含む水平方向にスライドする行の行を表示します。ボタンをクリックすると、ImageActivityが起動し、対応するアート作品が表示されます。しかし、テキストボタンのどれかをクリックすると、常に最後の絵が配列に表示されます。正しい整数がPutExtraに渡されない

2番目のアクティビティにint IDを渡して、対応する説明がクリックされると正しい絵を表示しようとしています。

ありがとうございました!ここで

は私の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); 

     } 
    }; 

私は整数のIDを渡すためにしようとしています私の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); 
} 

}

そして、私は取っている絵画のデータベース、 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

あなたが質問した質問に対する回答が表示されますが、実際にはViewPagerを使用してビューをリサイクルする必要があります – CQM

答えて

1

は、あなたのforループ内のすべてのbuttonためidを設定する - その後、

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

今はとても分かります。ありがとうございます! Nathaniel D. Wagonerのように、私は現在の絵を更新していませんでした。 – Freckles

+0

誰でも落とした - あなたはそれに理由をつけることができますか? –

1

道を。

すべての設定に使用しているループを見てください。

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

このループの最後にはどのような値がありますか?それは配列の最後の位置にあったものです。コードは決して提示しなかっ触れたものに「現在の絵」を更新

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

今すぐIDを渡すためにあなたのコードを見てください。ユーザーがタッチした絵を把握し、その絵のIDを使用する必要があります。

もう1つの回答は、buttonIdを絵のIDに設定することを推奨しています。これにはいくつかの問題がありますので、個人的には推奨しません。

代わりに、アダプタとViewHolderパターンを使用し、このメタデータを格納するためにビュー所有者を活用します。これははるかにスケーラブルなソリューションです。

+1

Arrgh!本当にありがとう!私はこのカップルの時間のこの問題を見つめていて、クリックされたボタンに基づいてIDを実際に更新しているわけではないことに気づいていませんでした。私のためにそれを歩く時間をとっていただきありがとうございます: – Freckles

関連する問題