我正在编写汽车管理应用程序,但在动态内容创建方面遇到了一些问题。我制作了一个带有菜单的NavigationView,以在边栏中显示选项。 MenuItems的左侧应有小图标。图像是在另一个上下文中创建的,并以Base64编码发送到mysql数据库,然后在刷新菜单项时将其解码。
String carName = obj.getString("carName");
String sign = obj.getString("sign");
String bitmap = obj.getString("bitmap");
MenuItem item = menu.add(0, i, 0, carName);
byte[] decodeString = Base64.decode(bitmap, Base64.DEFAULT);
Bitmap decodeImage = BitmapFactory.decodeByteArray(decodeString, 0, decodeString.length);
BitmapDrawable d = new BitmapDrawable(getResources(), decodeImage);
item.setIcon(d);
到目前为止,我所做的是使用Base64编码的String创建一个新的Drawable。然后,我只想将MenuItem的图标设置为创建的Drawable。这只会在MenuItem的左侧产生一个灰色框,而不是我想要的特定图像。
我使用的是compileSdkVersion 28,minSdkVersion 23,并通过Android Studio进行了编码。我运行调试器并检查了位图。 Android Studio可以很好地显示这些内容。
最佳答案
好吧,我终于开始工作了。
view.setItemIconTintList(null)
在这里做了把戏。
整个例子:
try {
JSONArray arr = new JSONArray(response);
NavigationView view = findViewById(R.id.nav_view);
view.setItemIconTintList(null);
Menu menu = view.getMenu();
menu.clear();
for (int i = 0; i < arr.length(); i++) {
JSONObject obj = arr.getJSONObject(i);
String carName = obj.getString("carName");
String sign = obj.getString("sign");
String bitmap = obj.getString("bitmap");
MenuItem item = menu.add(0, i, 0, carName);
byte[] decodeString = Base64.decode(bitmap, Base64.DEFAULT);
Bitmap decodeImage = BitmapFactory.decodeByteArray(decodeString, 0, decodeString.length);
BitmapDrawable d = new BitmapDrawable(getResources(), Bitmap.createScaledBitmap(decodeImage, 50, 50, true));
item.setIcon(d.getCurrent());
item.setIcon(item.getIcon());
MainActivity.super.onCreateOptionsMenu(menu);
}
} catch (JSONException e) {
e.printStackTrace();
}