在Android中将图像从路径设置为自定义按钮

时间:2013-09-06 16:29:29

标签: java android

我正在尝试在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​​?

3 个答案:

答案 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);