1

我试图在 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。我试图用

"android.resource://<the path>"

但 ImageView 无论如何都不想显示它。有人得到提示或知道我是否以错误的方式使用 API?

4

3 回答 3

2

您可以使用下面的行从资源中获取位图;

BitmapFactory.decodeResource(getResources(), R.drawable.my_button_image);

您可以使用下面的行直接设置图像并将其余部分留给系统

setImageResource( R.drawable.my_button_image);

编辑

getResources() : Android 资源系统跟踪与应用程序关联的所有非代码资产。您可以使用 Resources 类来访问应用程序的资源。您通常可以使用 getResources() 获取与您的应用程序关联的资源实例。

R.drawable.my_button_image : Android SDK 工具在构建时将应用程序的资源编译到应用程序二进制文件中。要使用资源,您必须将其正确安装在源代码树中(在项目的 res/ 目录中)并构建您的应用程序。作为构建过程的一部分,SDK 工具会为每个资源生成符号,您可以在应用程序代码中使用这些符号来访问资源,if you are using Eclipse then , your project is builded automatically

于 2013-09-06T16:39:27.377 回答
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>
于 2013-11-15T09:02:48.290 回答
-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);
于 2013-09-06T18:06:06.900 回答