#android
#Android
Вопрос:
Я пытаюсь отобразить некоторые изображения, а также связанный текст, но, похоже, не могу понять, как правильно циклически просматривать их с помощью события ImageButton onclick. Все, что я хотел бы сделать, это переходить к следующему изображению при каждом нажатии кнопки. Как только я дойду до конца, просто начните сначала.
Вот мой код. Это, вероятно, не самое элегантное, но, похоже, работает, за исключением того, что «currentid» каким-то образом меняется, поэтому я никогда не нахожу текущее изображение в цикле foreach.
public class Fundamentals extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fundamentals);
//Ojbects for forward and back buttons
ImageButton forwardButton = (ImageButton) findViewById(R.id.forward_button);
//image object
ImageView imageview = (ImageView) findViewById(R.id.fundamentals_image);
//Object for picture text
TextView textview = (TextView) findViewById(R.id.fundamentals_text);
//Images and associated text
Map<Integer, String> fundamentalPics = new LinkedHashMap<Integer, String>();
fundamentalPics.put(R.drawable.fund1, "some interesting text");
fundamentalPics.put(R.drawable.fund2, "more interesting text");
fundamentalPics.put(R.drawable.fund3, "and more");
//Set initial image
Map.Entry<Integer,String> pic = (Map.Entry<Integer, String>) fundamentalPics.entrySet().iterator().next();
imageview.setImageResource(pic.getKey());
textview.setText(pic.getValue());
imageview.setTag(fundamentalPics);
}
public void setImage(View v) {
//Object for picture text
TextView textview = (TextView) findViewById(R.id.fundamentals_text);
//Object for picture image
ImageView imageview = (ImageView) findViewById(R.id.fundamentals_image);
//get current id
Integer currentid = imageview.getId();
Map<Integer, String> fundamentalPics = (LinkedHashMap<Integer, String>) imageview.getTag();
Boolean foundImage = false;
for (Map.Entry<Integer, String> pic : fundamentalPics.entrySet())
{
if (foundImage.equals(true)) {
textview.setText(pic.getValue());
imageview.setImageResource(pic.getKey());
break;
}
//cycle until we find current image
if (pic.getKey().equals(currentid)) {
foundImage = true;
if (!fundamentalPics.entrySet().iterator().hasNext()) {
//we've reached the end. go to beginning....
Map.Entry<Integer,String> item = (Map.Entry<Integer, String>) fundamentalPics.entrySet().toArray()[0];
textview.setText(item.getValue());
imageview.setImageResource(item.getKey());
}
}
}
}
Комментарии:
1. почему бы вам не сохранить этот объект pic на уровне экземпляра, чтобы вы могли получить доступ с помощью любого метода обратного вызова, вместо того, чтобы получать его из image.getTag. А также вы можете сохранить текущий индекс изображения на уровне экземпляра, это упростит логику. Просто предложение.
Ответ №1:
Я думаю, вы сравниваете неправильно :
if (pic.getKey().equals(currentid))
На вашей карте вы сохранили drawable id, который является идентификатором изображения, поэтому getKey () вернет идентификатор drawable image, а currentid имеет идентификатор imageview, который определен в layout xml для этого imageview (а не идентификатор drawable изображения). Хотя оба являются целыми числами, но учтите разницу, одно из них из R.drawable. * а другое из R.id . *, один — это идентификатор каждого изображения, а другой — идентификатор imageview.
Итак, imageview — это контейнер, в котором будут отображаться изображения, и вы сравниваете идентификатор этого контейнера с идентификаторами изображений, очевидно, что они не будут совпадать.
К сожалению, для imageview нет getDrawableId(). Обходной путь заключается в сравнении с каждым отображаемым идентификатором :
Вы можете получить отрисовываемый вид
Drawable myDrawable = imageview.getDrawable();
Вы можете сравнить его с доступным ресурсом, таким как :
if(imageview.getDrawable()==getResources().getDrawable(R.drawable.fund1) || imageview.getDrawable()==getResources().getDrawable(R.drawable.fund2) || imageview.getDrawable()==getResources().getDrawable(R.drawable.fund3)){
//do work here
}
Конечно, вы можете использовать лучшие способы сравнения, я просто привел пример. Надеюсь, это поможет!