Как получить идентификатор изображения из строкового массива - PullRequest
0 голосов
/ 17 февраля 2019

Я создал специальный адаптер для моего GridView, который будет отображать изображение книги (Просмотр изображения) и ее название (Просмотр текста);Я объявил список имен книг в строковом файле: [strings.xml]

<string-array name="bookLabels">

    <item>android security</item>
    <item>penetration_testing</item>
    <item>red_team</item>
    <item>Linux Firewalls</item>
    <item>the_art_of_exploitation</item>
    <item>web_application_hacker</item>
    <item>Linux Basicsfor Hackers</item>
    <item>Black Hat Python</item>

</string-array>

Так что я хочу сделать то же самое с изображениями, вместо объявления их вкод вот так:

 private Integer[] bookImages =
        {
                R.drawable.android_security,
                R.drawable.penetration_testing,
                R.drawable.red_team,
                R.drawable.lf,
                R.drawable.the_art_of_exploitation,
                R.drawable.web_application_hacker,
                R.drawable.lbh,
                R.drawable.bhp

        };

Я объявил имена изображений в массиве строк с именем "bookImages" ,

  <string-array name="bookImages">
    <item>@drawable/android_security</item>
    <item>@drawable/penetration_testing</item>
    <item>@drawable/red_team</item>
    <item>@drawable/lf</item>
    <item>@drawable/the_art_of_exploitation</item>
    <item>@drawable/web_application_hacker </item>
    <item>@drawable/lbh </item>
    <item>@drawable/bhp </item>
 </string-array>

, а затем явосстановил расположение всех изображений, объявленных в массиве "bookimagesfromstring":

Resources resi = context.getResources();
bookImagesFromString = resi.getStringArray(R.array.bookImages);
System.out.println("bookImages Images test 1: " + 
Arrays.toString(bookImagesFromString))

это исходный код [основной активности]

public class main extends AppCompatActivity {
String[] labels;
String[ ] pages;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);


    Resources res = getResources();
    labels = res.getStringArray(R.array.bookLabels);
    pages = res.getStringArray(R.array.web_pages);

    GridView gridView = findViewById(R.id.gridView1);
    BookGrid myAdapter = new BookGrid(getApplicationContext(), labels);
    gridView.setAdapter(myAdapter);


    gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View v,
                                int position, long id) {

            Toast.makeText(
                    getApplicationContext(),
                    ((TextView) v.findViewById(R.id.gridtextView))
                            .getText(), Toast.LENGTH_SHORT).show();

           // Intent webPageIntent = new Intent(getApplicationContext(), 
          DisplayWebPage.class);
          //  webPageIntent.putExtra("WEB_PAGE", pages[ position ] );

           // startActivity( webPageIntent );



        }
    });
}

}

И [BookGrid Class]

public class BookGrid extends BaseAdapter {
private Context context;
private LayoutInflater inflater;
private String[] imageName;
private String[] bookImagesFromString;

private Integer[] bookImages =
        {
                R.drawable.android_security,
                R.drawable.penetration_testing,
                R.drawable.red_team,
                R.drawable.lf,
                R.drawable.the_art_of_exploitation,
                R.drawable.web_application_hacker,
                R.drawable.lbh,
                R.drawable.bhp

        };


public BookGrid(Context context, String[] imageName) {
    this.context = context;
    this.imageName = imageName;
    this.inflater = LayoutInflater.from(context);
}

@Override
public int getCount() {
    return bookImages.length;
}

@Override
public Object getItem(int position) {
    return position;
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    /*
    Resources rest = context.getResources();
    String[] labels = rest.getStringArray(R.array.bookLabels);
    System.out.println("bookImagess Tex: " + Arrays.toString(labels));

    */
    Resources resi = context.getResources();
    bookImagesFromString = resi.getStringArray(R.array.bookImages);
    System.out.println("bookImages Images test 1: " + Arrays.toString(bookImagesFromString));


    if (convertView == null) {
        convertView = inflater.inflate(R.layout.layout_grid_image, parent, false);
        TextView txtv = convertView.findViewById(R.id.gridtextView);
        ImageView imgv = convertView.findViewById(R.id.gridImageView);

        //To Avoid ArrayIndexOutOfBoundsException
        //boolean inBounds = (position >= 0) && (position <= imageName.length);

            txtv.setText(imageName[position]);

      //imgv.setImageResource(bookImagesFromString[position]);
        imgv.setImageResource(bookImages[position]);

    } else {

    }

    return convertView;
}

результат для массива " bookImagesFromString " был следующим:

([res/drawable-v24/android_security.png, res/drawable-v24/penetration_testing.png, res/drawable-v24/red_team.png, res/drawable/lf.jpg, res/drawable-v24/the_art_of_exploitation.png, res/drawable-v24/web_application_hacker.png, res/drawable/lbh.png, res/drawable-v24/bhp.png])

Таким образом, вопрос заключается в том, , как преобразовать массив bookImagesFromString в массив , содержащий идентификатор каждого изображения ?-И после использования в этой части кода:

 imgv.setImageResource(bookImagesID[position]); 

Спасибо.

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

для имени изображения, как I_A_Mok сказал, что я взял только:

<string-array name="bookImages">
    <item>android_security</item>
    <item>penetration_testing</item>
    <item>red_team</item>
    <item>lf</item>
    <item>the_art_of_exploitation</item>
    <item>web_application_hacker </item>
    <item>lbh </item>
    <item>bhp </item>
</string-array>

Итак, у меня было два решения:

Метод с Context:

public static Integer[] getIds(Context context, String[] str) {

    Integer[] bookID = new Integer[str.length];
    for (int i = 0; i < str.length; i++) {
        bookID[i] = context.getResources().getIdentifier(str[i], "drawable", context.getPackageName());
    }
    return bookID;
}

Или без контекста (этот подход быстрее, чем первый Получение ресурсов в Android ):

public static Integer[] getIds(String[] str) {

    Integer[] bookID = new Integer[str.length];

    try {
        for (int i = 0; i < str.length; i++) {
            Class res = R.drawable.class;
            Field field = res.getField(str[i]);
            int drawableId = field.getInt(null);
            bookID[i] = drawableId;
        }
    } catch (Exception e) {
        Log.e("MyTag", "Failure to get drawable id.", e);
        e.printStackTrace();

    }
    return bookID;
}

и вот полный код

package com.example.gridview.BookGridWebView;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.example.gridview.R;
import java.lang.reflect.Field;
import java.util.Arrays;


public class BookGrid extends BaseAdapter {


private Context context;
private LayoutInflater inflater;
private String[] imageName;
private String[] bookImagesFromStringArray;
private Integer[] bookImages =
        {
                R.drawable.android_security,
                R.drawable.penetration_testing,
                R.drawable.red_team,
                R.drawable.lf,
                R.drawable.the_art_of_exploitation,
                R.drawable.web_application_hacker,
                R.drawable.lbh,
                R.drawable.bhp

        };


public BookGrid(Context context, String[] imageName) {
    this.context = context;
    this.imageName = imageName;
    this.inflater = LayoutInflater.from(context);
}

@Override
public int getCount() {
    return bookImages.length;
}

@Override
public Object getItem(int position) {
    return position;
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {


    bookImagesFromStringArray = 
    context.getResources().getStringArray(R.array.bookImageName);

   //the table contains the IDs of each Image
   Integer[] bookIDs = getIds(context,bookImagesFromStringArray);

    if (convertView == null) {
        convertView = inflater.inflate(R.layout.layout_grid_image, parent, false);
        TextView txtv = convertView.findViewById(R.id.gridtextView);
        ImageView imgv = convertView.findViewById(R.id.gridImageView);


        txtv.setText(imageName[position]);
        // imgv.setImageResource(bookImages[position]);
        imgv.setImageResource(bookIDs[position]);

    } else {

    }

    return convertView;
}



public static Integer[] getIds(Context context, String[] str) {

    Integer[] bookID = new Integer[str.length];
    for (int i = 0; i < str.length; i++) {
        bookID[i] = context.getResources().getIdentifier(str[i], "drawable", context.getPackageName());
    }
    return bookID;
}

public static Integer[] getIds(String[] str) {

    Integer[] bookID = new Integer[str.length];

    try {
        for (int i = 0; i < str.length; i++) {
            Class res = R.drawable.class;
            Field field = res.getField(str[i]);
            int drawableId = field.getInt(null);
            bookID[i] = drawableId;
        }
    } catch (Exception e) {
        Log.e("MyTag", "Failure to get drawable id.", e);
        e.printStackTrace();

    }
    return bookID;
}

}

Спасибо.

0 голосов
/ 22 февраля 2019

Попробуйте строковый массив следующим образом:

<string-array name="bookImages">
    <item>android_security</item>
    <item>penetration_testing</item>
    <item>red_team</item>
    <item>lf</item>
    <item>the_art_of_exploitation</item>
    <item>web_application_hacker</item>
    <item>lbh</item>
    <item>bhp</item>
</string-array>

и адаптером вот так:

public class BookGrid extends BaseAdapter {
private Context context;
private LayoutInflater inflater;
private String[] imageName;
private Integer[] bookImages;

public BookGrid(Context context, String[] imageName) {
    this.context = context;
    this.imageName = imageName;
    this.inflater = LayoutInflater.from(context);

    Resources resi = context.getResources();
    String[] bookImagesFromString = resi.getStringArray(R.array.bookImages);
    bookImages = new Integer[bookImagesFromString.length];
    for (int i = 0; i < bookImagesFromString.length; i++) {
        bookImages[i] = (resi.getIdentifier(bookImagesFromString[i], "drawable", context.getPackageName()));
    }
}

@Override
public int getCount() {
    return imageName.length;
}

@Override
public Object getItem(int position) {
    return position;
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
/*
Resources rest = context.getResources();
String[] labels = rest.getStringArray(R.array.bookLabels);
System.out.println("bookImagess Tex: " + Arrays.toString(labels));
*/
    if (convertView == null) {
        convertView = inflater.inflate(R.layout.layout_grid_image, parent, false);
    }
    TextView txtv = convertView.findViewById(R.id.gridtextView);
    ImageView imgv = convertView.findViewById(R.id.gridImageView);

    txtv.setText(imageName[position]);
    imgv.setImageResource(bookImages[position]);

    return convertView;
}
}

Надеюсь, это поможет!

...