В My App пользователь создает новую учетную запись, вводя некоторые учетные данные в диалоговом окне. Внутри есть GridView
диалоговое окно с разными значками для учетных записей. Пользователь может выбрать любой значок для своей учетной записи при создании учетной записи. Проблема в том, что изображение не отображается в виде списка и в браузере БД для SQLite. Я не знаю, что мне делать, даже после долгих поисков. Вот моя попытка:
Массив Int, содержащий изображения: (многие изображения имеют формат .svg, а другие — .png)
int[] icons = {R.drawable.personalbusaccount, R.drawable.ic_accountant, R.drawable.ic_bank_account,
R.drawable.multipleaccount, R.drawable.ic_accounting, R.drawable.ic_consultant, R.drawable.choice,
R.drawable.ic_businesswoman, R.drawable.ic_man, R.drawable.ic_login};
После нажатия кнопки:
@Override
public void onClick(View view) {
AlertDialog.Builder builder = new AlertDialog.Builder(AccountsActivity.this);
LayoutInflater inflater = getLayoutInflater();
View v = inflater.inflate(R.layout.new_account_dialog, null);
final EditText editText = v.findViewById(R.id.et_accname);
final GridView gv = v.findViewById(R.id.accicon_grid_view);
NewAccountGAdapter newAccountGAdapter = new NewAccountGAdapter(AccountsActivity.this, icons);
gv.setAdapter(newAccountGAdapter);
gv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
for (int i = 0; i < gv.getChildCount(); i++) {
if(position == i ){
gv.getChildAt(i).setBackgroundColor(getResources().getColor(R.color.colorLightGrey));
accountIcon = inttoByteArray(icons[position]);
}else{
gv.getChildAt(i).setBackgroundColor(Color.TRANSPARENT);
}
}
}
});
builder.setPositiveButton("Create", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
accountName = editText.getText().toString();
boolean dataAdded = databaseHelper.addAccount(accountIcon, accountName, "0 Rs");
if (dataAdded){
Toast.makeText(AccountsActivity.this, "Account Created !", Toast.LENGTH_SHORT).show();
populateListView();
}else {
Toast.makeText(AccountsActivity.this, "Account not Created ", Toast.LENGTH_SHORT).show();
}
}
});
Методы: inttoByteArray()
:
private byte[] inttoByteArray(final int i){
ByteArrayOutputStream bos = new ByteArrayOutputStream();
DataOutputStream dataOutputStream = new DataOutputStream(bos);
try {
dataOutputStream.writeInt(i);
} catch (IOException e) {
e.printStackTrace();
}
try {
dataOutputStream.flush();
} catch (IOException e) {
e.printStackTrace();
}
return bos.toByteArray();
}
В getView()
моего пользовательского BaseAdapter
:
View view = LayoutInflater.from(context).inflate(R.layout.accounts_list_items, parent, false);
ImageView imageView = view.findViewById(R.id.acc_icon);
TextView textViewName = view.findViewById(R.id.tv_accName);
TextView textViewBlnc = view.findViewById(R.id.tv_accBlnc);
byte[] icons = accountsModelList.get(position).getIcon();
Bitmap bm = BitmapFactory.decodeByteArray(icons, 0, icons.length);
imageView.setImageBitmap(bm);
textViewName.setText(accountsModelList.get(position).getAccName());
textViewBlnc.setText(accountsModelList.get(position).getAccBlnc());
Класс DatabaseHelper:
private static final String TABLE_NAME = "accounts";
private static final String TABLE_COL1 = "acc_id";
private static final String TABLE_COL2 = "acc_icon";
private static final String TABLE_COL3 = "acc_name";
private static final String TABLE_COL4 = "acc_blnc";
public void onCreate(SQLiteDatabase db) {
String accountsTable = "CREATE TABLE " + TABLE_NAME + " (" + TABLE_COL1 + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
TABLE_COL2 + " BLOB, " + TABLE_COL3 + " VARCHAR(300), " + TABLE_COL4 + " VARCHAR(500))";
db.execSQL(accountsTable);
}
public boolean addAccount(byte[] icon, String acName, String acBlnc){
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(TABLE_COL2, icon);
contentValues.put(TABLE_COL3, acName);
contentValues.put(TABLE_COL4, acBlnc);
return db.insert(TABLE_NAME, null, contentValues)>0;
}
Пожалуйста, мне нужна помощь!
icons
— это простоint
s, поэтомуicons[position]
— это одинint
. Если это действительно то, что вы пытаетесь сохранить, нет необходимости вByteArrayOutputStream
,DataOutputStream
и т. д. Просто сохранитеint
. Кроме того, я не вижу в вашем сообщении кода, связанного с базой данных. - person Mike M.   schedule 24.08.2019R.drawable
— было бы лучше как-то хранить это и загружать их из ресурсов при необходимости. Поскольку идентификаторint
может измениться при перестроении, вероятно, самым простым и надежным способом будет сохранить имя ресурса в БД и изменить его обратно наint
при его извлечении. Взгляните на второй блок кода в этом ответе, который вы можете использовать для переключения между именем ресурса и значениемint
. - person Mike M.   schedule 24.08.2019iconName()
там. Например, если вы вызываетеString name = iconName(icons[0]);
, тоname
будет"personalbusaccount"
, и это то, что будет храниться в базе данных. Когда вам нужно загрузить изображение, вы получите значение"personalbusaccount"
из вашегоCursor
— например,String iconName = cursor.getString(...);
— и вы передадите его методуiconRes()
—int resId = iconRes(iconName);
. Затем вы можете использовать это сImageView#setImageResource(resId)
,getDrawable(resId)
и т. д. - person Mike M.   schedule 24.08.2019iconName()
иiconRes()
находятся во втором блоке кода в ответе, на который я ссылался ранее. - person Mike M.   schedule 24.08.2019jpg
, илиpng
, илиxml
и т.д.? - person Mike M.   schedule 25.08.2019BitmapFactory
не будет работать сsvg
s. Он обрабатывает только растровые изображения, такие какbmp
,jpg
,png
и т. д. Когда вы загружаете изображения, вам не нужныBitmap
. Вам просто нужноDrawable
s. Вместо этого используйтеgetDrawable()
илиContextCompat.getDrawable()
, чтобы получить их. - person Mike M.   schedule 25.08.2019inttoByteArray()
метода. Вам это больше не нужно. Теперь вы просто сохраняетеString
в базе данных. - person Mike M.   schedule 25.08.2019AccountsActivity
и сделал ихstatic
. Вместо этого вы можете поместить их в служебный класс. - person Mike M.   schedule 25.08.2019