从图像视图获取可绘制对象

3

当我按照这篇文档所述实现剪辑可绘制对象的例子时,ImageView.getDrawable始终返回null。 有人能帮我吗?

在MainActivity.java的onCreate方法中:

@Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ImageView imageview = (ImageView) findViewById(R.id.image);
        ClipDrawable drawable = (ClipDrawable) imageview.getDrawable();
        drawable.setLevel(drawable.getLevel() + 1000); //Line number 21
    }

日志记录器

 02-04 12:16:31.156: E/AndroidRuntime(4611): FATAL EXCEPTION: main02-04 12:16:31.156: E/AndroidRuntime(4611): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.test/com.example.test.MainActivity}: java.lang.NullPointerException

02-04 12:16:31.156: E/AndroidRuntime(4611):      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)

02-04 12:16:31.156: E/AndroidRuntime(4611):      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)

02-04 12:16:31.156: E/AndroidRuntime(4611):      at android.app.ActivityThread.access$1500(ActivityThread.java:117)

02-04 12:16:31.156: E/AndroidRuntime(4611):      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)

02-04 12:16:31.156: E/AndroidRuntime(4611):      at android.os.Handler.dispatchMessage(Handler.java:99)

02-04 12:16:31.156: E/AndroidRuntime(4611):      at android.os.Looper.loop(Looper.java:123)

02-04 12:16:31.156: E/AndroidRuntime(4611):      at android.app.ActivityThread.main(ActivityThread.java:3683)

02-04 12:16:31.156: E/AndroidRuntime(4611):      at java.lang.reflect.Method.invokeNative(Native Method)

02-04 12:16:31.156: E/AndroidRuntime(4611):      at java.lang.reflect.Method.invoke(Method.java:507)

02-04 12:16:31.156: E/AndroidRuntime(4611):      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)

02-04 12:16:31.156: E/AndroidRuntime(4611):      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)

02-04 12:16:31.156: E/AndroidRuntime(4611):      at dalvik.system.NativeStart.main(Native Method)

02-04 12:16:31.156: E/AndroidRuntime(4611): Caused by: java.lang.NullPointerException

02-04 12:16:31.156: E/AndroidRuntime(4611):      at com.example.test.MainActivity.onCreate(MainActivity.java:21)

02-04 12:16:31.156: E/AndroidRuntime(4611):      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)

02-04 12:16:31.156: E/AndroidRuntime(4611):      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)

02-04 12:16:31.156: E/AndroidRuntime(4611):      ... 11 more

分享你的Logcat以及你的代码片段。 - Usman Kurd
@Dinesh 你想要拍摄 ImageView 的快照,是吗? - Ajay S
@UsmanKurd 我已经添加了日志输出。 - Dinesh T A
@TGMCians 不是,我只是在探索裁剪可绘制对象。 - Dinesh T A
MainActivity.java文件第21行的内容是什么? - Praful Bhatnagar
4个回答

2

您需要重写onWindowsFocusChanged()

 @Override
 public void onWindowFocusChanged(boolean hasWindowFocus) {
    super.onWindowFocusChanged(hasWindowFocus);
   ClipDrawable drawable = (ClipDrawable) imageview.getBackground();
    drawable.setLevel(drawable.getLevel() + 1000); //Line number 21
 }

当您尝试获取imageView的值(drawable image)时,它可能还没有正确显示。在onWindowsFocusChanged()方法中,将通知用户视图已经加载完成,这是您可以获取其数据的时间。


2
我已经更新了我的代码,将imageview.getDrawable更改为image.getBackground() - She Smile GM
谢谢 @SheSmile,它运行得很好。我已经在按钮中添加了一个点击事件,在点击事件中设置了drawable的level值。 - Dinesh T A

1

可能会出现null drawable的情况,因此会出现此错误。

首先将任何image设置到ImageView中,这样您就可以获得Drawable

protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ImageView imageview = (ImageView) findViewById(R.id.image);
        imageview.setBackgroundResource(R.drawable.icon);
        ClipDrawable drawable = (ClipDrawable) imageview.getDrawable();
        if(drawable != null){
        drawable.setLevel(drawable.getLevel() + 1000); //Line number 21
        }
    }

请查看此链接以获取剪辑可绘制资源的示例:http://developer.android.com/guide/topics/resources/drawable-resource.html#Clip。我在图像中执行了相同的操作,但是我没有提供src,而是提供了背景剪辑可绘制资源。 - Dinesh T A
android:background="@drawable/clip" 你设置了吗? - Parag Chauhan

1

到目前为止,没有一个答案是正确的。

问题在于,在图像视图中,可绘制对象是使用 android:background="@drawable/clip" 进行附加的,并且它是通过 ClipDrawable drawable = (ClipDrawable) imageview.getDrawable(); 检索的。

修复方法:

更改 imageview 的 xml

android:background="@drawable/clip" -> android:src="@drawable/clip"

或者

更改按钮回调代码

ClipDrawable drawable = (ClipDrawable) imageview.getDrawable(); -> ClipDrawable drawable = (ClipDrawable) imageview.getBackground();

不要同时更改两者,否则问题会再次出现。只更改其中一个。


1

如果您可以使用视图的ID成员变量,这是一种简单的方法:只需使用v.setId()存储R.drawable ID,然后使用v.getId()获取它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接