我正在尝试在Android中创建自定义按钮。 该按钮可以通过XML获取参数,从布局中使用时看起来有点像这样:
customimagebutton:src="@drawable/my_button_image"
然后我实现了一个与我的按钮(在xml中定义)一起工作的类。在那个类中,我可以读取传递的参数,但这是我的问题所在。
当我获得上述资源时,它将作为路径传递。
"//res/drawable-xhdpi/my_button_image.png"
我现在想要使用此路径,并将图像设置为ImageView。问题是我似乎无法获得资源的有效句柄。我试过了
getResources().getIdentifier( <full path or just the name, with and without .png>, "drawable, null);
但总是返回0.我试图用
创建一个Uri"android.resource://<the path>"
但ImageView不想再显示它。任何人都有提示或知道我是否以错误的方式使用API?
答案 0 :(得分:2)
您可以使用以下行从资源获取位图;
BitmapFactory.decodeResource(getResources(), R.drawable.my_button_image);
您可以使用以下行直接设置图像并将其余部分留给系统
setImageResource( R.drawable.my_button_image);
已修改:
getResources(): Android资源系统会跟踪与应用程序关联的所有非代码资产。您可以使用Resources类来访问应用程序的资源。您通常可以使用getResources()获取与您的应用程序关联的Resources实例。
R.drawable.my_button_image: Android SDK工具在构建时将应用程序的资源编译为应用程序二进制文件。要使用资源,必须在源代码树中(在项目的res /目录中)正确安装它并构建应用程序。作为构建过程的一部分,SDK工具为每个资源生成符号,您可以在应用程序代码中使用这些符号来访问资源if you are using Eclipse then , your project is builded automatically
答案 1 :(得分:0)
我得到了一个解决方案,我认为主要的错误是我没有获得getIdentifier的正确包。
这是一些来源(因为我必须删除一些部分,可能会有轻微的错误)。
我的自定义按钮(java):
public class CustomImageButton extends RelativeLayout
{
...
public CustomImageButton(Context context, AttributeSet attrs)
{
super(context, attrs);
LayoutInflater inf = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inf.inflate( <my_xml_file> , this, true);
TypedArray arr = context.obtainStyledAttributes(attrs, R.styleable.CustomImageButton);
CharSequence imageSrc = arr.getString(R.styleable.CustomImageButton_src);
if (imageSrc != null)
{
String fileName = new File("" + imageSrc).getName();
fileName = fileName.substring(0, fileName.indexOf("."));
int resId = getResources().getIdentifier(fileName, "drawable", <my_top_level_package_very_important_to_get_right>);
ImageButton button = ((ImageButton) findViewById(R.id.buttonImage));
button.setImageDrawable(getResources().getDrawable(resId));
}
}
...
}
然后在attrs.xml中,上面使用了“src”。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="CustomImageButton">
<attr name="src" format="string" />
</declare-styleable>
...
</resources>
然后可以从布局xml中使用它,注意“xmlns:customimagebutton”:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:customimagebutton="http://schemas.android.com/apk/res-auto"
....>
<my.package.custom.MyCustomButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
customimagebutton:src="@drawable/my_image" />
</RelativeLayout>
答案 2 :(得分:-1)
您好我已按照此程序解决此问题,我刚刚在AsyncTask中下载了此图片。
actualUrl = new URL("http://t3.gstatic.com/images?q=tbn:ANd9GcRhyKydwWIfkRw6O1VJB7JCzy3aevgyDnn4rN6wmWRflAxSGCwrvA") ;
HttpURLConnection cn = (HttpURLConnection)actualUrl.openConnection();
cn.connect();
stream = cn.getInputStream() ;
之后我使用以下代码保存此文件:
FileOutputStream out = new FileOutputStream(object.getFilesDir().getAbsolutePath()+"/imagename.png");
Log.i(object.getFilesDir().getAbsolutePath(), "complete-path");
(BitmapFactory.decodeStream(stream) ).compress(Bitmap.CompressFormat.PNG, 100, out);
现在要在图像视图中显示此图像,我使用了此代码部分
Bitmap bit = BitmapFactory.decodeFile(object.getFilesDir().getAbsolutePath()+"/imagename.png");
if ( bit == null )
Log.i("bit is null","Completed");
img.setImageBitmap(bit);