У меня есть список элементов, после нажатия на список открывается новое действие с подробностями. Проблема в том, что я не могу реализовать - загрузка изображения после нажатия на определенную строку из подробной активности. Например, в MainActivity есть:
String one[] = {"dog", "cat", "horse", "snail"};
String two[] = {"aaa", "bbb", "ccc", "ddd"};
String three[] = {"111", "**222**", "333", "**222**"};
Откройте приложение, щелкните второй элемент списка (кошка) и откройте новое действие с подробностями (все строки для кошки) Мне нужно, в этом случае, после нажатия на «Строка три» - если строка 222, открыть изображение (drawable/222.jpg), в данном случае это для «кошки» и «улитки». И после нажатия на "333" показать изображение 333.jpg...
Если это возможно, было бы лучше открыть изображение с помощью кнопки «Назад», чтобы вернуться к подробной деятельности.
Упрощенная основная активность:
String one[] = {"dog", "cat", "horse", "snail"};
String two[] = {"aaa", "bbb", "ccc", "ddd"};
String three[] = {"111", "222", "333", "222"};
List<ItemsModel> itemsModelList = new ArrayList<>();
ListView listView;
CustomAdapter customAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = findViewById(R.id.listview);
for(int i = 0;i < one.length;i++){
ItemsModel itemsModel = new ItemsModel(one[i],two[i],three[i]);
itemsModelList.add(itemsModel);
}
customAdapter = new CustomAdapter(itemsModelList,this);
listView.setAdapter(customAdapter);
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
int id = item.getItemId();
if (id == R.id.searchView){
return true;
}
return super.onOptionsItemSelected(item);
}
public class CustomAdapter extends BaseAdapter implements Filterable {
private List<ItemsModel> itemsModelsl;
private List<ItemsModel> itemsModelListFiltered;
private Context context;
public CustomAdapter(List<ItemsModel> itemsModelsl, Context context) {
this.itemsModelsl = itemsModelsl;
this.itemsModelListFiltered = itemsModelsl;
this.context = context;
}
@Override
public int getCount() {
return itemsModelListFiltered.size();
}
@Override
public Object getItem(int position) {
return itemsModelListFiltered.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View view = getLayoutInflater().inflate(R.layout.row_items,null);
TextView one = view.findViewById(R.id.one);
TextView two = view.findViewById(R.id.two);
one.setText(itemsModelListFiltered.get(position).getone());
two.setText(itemsModelListFiltered.get(position).gettwo());
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("main activity","item clicked");
startActivity(new Intent(MainActivity.this, ItemsActivity.class).putExtra("items",itemsModelListFiltered.get(position)));
}
});
return view;
}
////Модель Предмета:
public class ItemsModel implements Serializable {
private String one;
private String two;
private String three;
public ItemsModel(String one, String two, String three) {
this.one = one;
this.two = two;
this.three = three;
}
public String getone() {
return one;
}
public void setone(String one) {
this.one = one;
}
public String gettwo() {return two; }
public void settwo(String two) { this.two = two; }
public String getthree() {return three; }
public void setthree(String three) { this.three = three; }
///
Если нужен Itemactivity
или activity.xml скопирую.
Мне не удалось реализовать это в коде -> если строка 222, открыть изображение (drawable/222.jpg)
Для файла внутри папки res/drawable
имя файла не может начинаться с цифры, например 111.jpg
, 222.jpg
и т. д. Поэтому для этого вы можете добавить префикс, начинающийся с буквы, например image_111.jpg
, image_222.jpg
и т. д.
Решение
В ItemsActivity
используйте getIdentifier(String, String, String), чтобы получить идентификатор ресурса (R.drawable.image_222
) по имени ресурса (image_222
).
public class ItemActivity extends AppCompatActivity {
TextView textView;
TextView textView2;
TextView textView3;
ItemsModel itemsModel;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.textView);
textView2 = findViewById(R.id.textView2);
textView3 = findViewById(R.id.textView3);
Intent intent = getIntent();
if (intent.getExtras() != null) {
itemsModel = (ItemsModel) intent.getSerializableExtra("items");
textView2.setText(itemsModel.getone());
textView.setText(itemsModel.gettwo());
textView3.setText(itemsModel.getthree());
textView3.setClickable(true);
textView3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Get drawable name
String drawableName = "image_" + itemsModel.getthree();
// Find drawable resource id by drawable name
int drawableResId = getResources().getIdentifier(
drawableName,
"drawable",
getPackageName());
showImageDetail(drawableResId);
}
});
}
}
private void showImageDetail(int imageResId) {
// Using a dialog or activity to open image detail.
AlertDialog.Builder builder = new AlertDialog.Builder(this);
ImageView imageView = new ImageView(this);
imageView.setImageResource(imageResId);
builder.setView(imageView);
builder.create().show();
}
}
Обновлять
Первая проблема заключается в распознавании «222», когда String three [] является, например, «xxx & 222», поэтому мне нужно распознавать «222» внутри строки отверстий. В какой-то большей строке будут и 222, и 333, могу ли я щелкнуть по обоим? Один покажет image_222, другой image_333.
Это довольно сложно немного. Например, значение three
может быть
333 ггг 444 ххх и 222
В этом случае вы должны перебрать строку и найти номер изображения, например 333, 444, 222, и вычислить его начальный и конечный индекс, а затем использовать метод SpannableStringBuilder.setSpan(), чтобы установить прослушиватель кликов для каждого номера изображения. .
В следующем коде я буду использовать
Java Regex, чтобы найти все номера изображений в значении three
.
SpannableStringBuilder.setSpan() метод для установки прослушивателя кликов по номерам изображений.
Код
public class ItemsActivity extends AppCompatActivity {
TextView textView;
TextView textView2;
TextView textView3;
ItemsModel itemsModel;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_items);
textView = findViewById(R.id.textView);
textView2 = findViewById(R.id.textView2);
textView3 = findViewById(R.id.textView3);
Intent intent = getIntent();
if (intent.getExtras() != null) {
itemsModel = (ItemsModel) intent.getSerializableExtra("items");
textView.setText(itemsModel.getone());
textView2.setText(itemsModel.gettwo());
String three = itemsModel.getthree();
SpannableStringBuilder builder = new SpannableStringBuilder(three);
String regex = three;
Pattern pattern = Pattern.compile("(\\d{3})");
Matcher matcher = pattern.matcher(regex);
while (matcher.find()) {
String imageNumber = matcher.group(0);
int numberStartIndex = three.indexOf(imageNumber);
int numberEndIndex = numberStartIndex + imageNumber.length();
builder.setSpan(new ClickableSpan() {
@Override
public void onClick(@NonNull View widget) {
showImageDetailByImageNumber(imageNumber);
}
}, numberStartIndex, numberEndIndex, SpannableStringBuilder.SPAN_EXCLUSIVE_EXCLUSIVE);
regex = three.substring(numberEndIndex);
matcher = pattern.matcher(regex);
}
textView3.setMovementMethod(LinkMovementMethod.getInstance());
textView3.setText(builder);
}
}
/**
* Find the image drawable (image_222.jpg) based on its number name (222)
* @param imageNumber The image number like 111, 222, 333.
*/
private void showImageDetailByImageNumber(String imageNumber) {
// Get drawable name
String drawableName = "image_" + imageNumber;
// Find drawable resource id by drawable name
int drawableResId = getResources().getIdentifier(
drawableName,
"drawable",
getPackageName());
// Using a dialog or activity to open image detail.
AlertDialog.Builder builder = new AlertDialog.Builder(this);
ImageView imageView = new ImageView(this);
imageView.setImageResource(drawableResId);
builder.setView(imageView);
builder.create().show();
}
}
Вторая проблема заключается в том, что имя изображения папки с возможностью рисования должно содержать маленькие буквы и цифры. Мне понадобится строка с заглавными буквами (например, A222)
В Android имя файла внутри drawable должно начинаться со строчной буквы, поэтому я думаю, что вы используете только префикс для изображения внутри этой папки, например image_
, img_
или любой другой префикс, который соответствует вашим требованиям.
Спасибо, сынок, может быть, я плохо объяснил. Я не хочу открывать image_222 во втором действии, во втором действии будет так: 1 строка: кошка, под этим- 2 ряд: bbb и под этим "222", а во втором действии после нажатия на "222" он должен открыть image_222. В новом действии или во всплывающем окне «window.
@Namma Я обновил ответ, пожалуйста, дайте мне знать, соответствует ли он вашим требованиям.
Я просто добавил новый ответ, чтобы было понятно, и есть прикрепленное изображение, как это должно выглядеть. Спасибо за помощь
@Namma Пожалуйста, посмотрите мой обновленный ответ, основанный на вашем коде.
Есть какая-то проблема, я не могу войти во вторую активность, когда нажимаю на список, на кошку или что-то еще. Он открыл папку загрузки. Я проверю код еще раз
Что-то не так, с этим не могу войти во вторую активность. Учтите, что строка three[] должна быть текстом без изображения. После нажатия на текст во втором действии должно загрузиться изображение. Без нажатия на текст 222 не должно отображаться изображение. Таким образом, третья строка останется 222, а не image_222. Спасибо
Это визуальный ответ i.stack.imgur.com/sdyyC.jpg
Вы имеете в виду, что три текста будут иметь только номер 222, но при нажатии на него будет загружен файл изображения с именем image_222.jpg, это правильно?
Как называется файл изображения для текста «222» в папке с возможностью рисования?
Это верно. После щелчка по списку Cat открывается вторая активность с «подробностями для Cat», например Cat, bbb, 222, и если щелкнуть по 222, должно открыться изображение. Имя изображения может быть image_222.jpg, я думаю, что я хорошо выразил это на фото - (визуальный ответ) выше Спасибо за помощь сыну
Я обновил ответ, пожалуйста, проверьте еще раз.
То же самое, когда я нажимаю «Список», второго действия вообще нет, папка загрузки открывается, поэтому я не могу проверить код для изображения. Я просто копирую код в ItemsActivity, мой код был в порядке для второго действия, возможно, есть некоторая коллизия.
Не могли бы вы дважды проверить код, в котором вы начинаете второе действие, кажется, в вашем коде что-то идет не так.
Подождите, все в порядке. Позвольте мне проверить, я напишу в течение 5 мин.
Успокойтесь, пожалуйста, дайте мне знать, если у вас возникнут какие-либо проблемы.
Убедитесь, что в папке drawable есть файл с именем image_222.jpg
.
У меня проблема, чтобы попробовать это на устройстве, но на эмуляторе работает отлично. ТЫ ЛУЧШИЙ Сын. Спасибо за время и терпение.
Попробуйте удалить, а затем снова установите приложение на устройство.
Можем ли мы немного изменить код. У меня есть 2 проблемы, это не так важно, но если это возможно, будет хорошо. Первая проблема заключается в распознавании «222», когда String three [] является, например, «xxx & 222», поэтому мне нужно распознавать «222» внутри строки отверстий. В какой-то большей строке будут и 222, и 333, могу ли я щелкнуть по обоим? Один покажет image_222, другой image_333. Вторая проблема заключается в том, что внутри имени изображения папки с возможностью рисования должны быть маленькие буквы и цифры. Мне понадобится строка с заглавными буквами (например, A222. Самая важная часть уже решена Сыном, если это сложно, просто проигнорируйте это.
@Namma Я обновляю ответ, пожалуйста, проверьте еще раз.
Вот и все. Большое спасибо еще раз. (и извините за отправку сюда в комментариях, я не могу начать обсуждение в чате с этими пунктами)
Хорошо, я только что сделал это визуальным, это должно быть так.
В этот момент первая и вторая активность выполняются нормально, но это все. Теперь мне нужно реализовать часть кода для второго действия, как на изображении, которое я даю. При нажатии на «222» (во втором действии) должно открыться drawable/image_222.jpg При нажатии на «333» (во втором действии) должно открыться drawable/image_333.jpg Строка 222 будет в нескольких местах, например даю для Кота и для Улитки. Итак, насколько я понимаю, это должно быть что-то вроде этого: если «три равно» «222» при нажатии показывает «drawable image_222.jpg» (я знаю, что это выглядит плохо, я просто упростил это)
Вниз коротко ItemActivity:
TextView textView;
TextView textView2;
TextView textView3;
ItemsModel itemsModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_items_preview);
textView = findViewById(R.id.textView);
textView2 = findViewById(R.id.textView2);
textView3 = findViewById(R.id.textView3);
Intent intent = getIntent();
if (intent.getExtras() != null){
itemsModel = (ItemsModel) intent.getSerializableExtra("items");
textView2.setText(itemsModel.getone());
textView.setText(itemsModel.gettwo());
textView3.setText(itemsModel.getthree());
}
Так в чем проблема?