问题 Android:如何使用View的setTag,getTag和findViewWithTag方法?


我的Android应用程序的一段代码遇到了一些麻烦。我不断得到一个 NullPointerException 当试图设置一个背景时 ImageView 目的。

这是代码:

public View getView(int position, View view, ViewGroup parent) {
    ImageView imageView;
    if (view == null) {
        imageView = new ImageView(mContext);
    } else {
        imageView = (ImageView) view;
    }
    imageView.setTag(position);
    return imageView;
}

private OnItemClickListener itemClickListener = new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View v, int position, long id) {

        ImageView imageView;
        //Variable i, here, is from a for loop.
        imageView = (ImageView)v.findViewWithTag(i);
        //I get a NullPointerException at the next line, "Log.d"
        Log.d("View 1", imageView.toString());
        //If I get rid of the "Log.d" line above, 
        //the NullPointerException occurs on the next line
        imageView.setBackgroundColor(Color.BLUE);
        imageView = (ImageView)v.findViewWithTag(position);

        Log.d("View 2", imageView.toString());
        imageView.setBackgroundColor(Color.BLUE);

    };
}

我怀疑我的代码问题是因为我传递了什么参数 setTag() 方法和我传递的参数 findViewWithTag() 方法。如果有人可以向我展示如何设置标签和使用标签查找视图的示例,我将非常感激。

感谢您的时间。

编辑:这是错误日志。我不知道该把它放在哪里,所以我会把它放在这里。

05-04 21:47:24.314: ERROR/AndroidRuntime(335): FATAL EXCEPTION: main
05-04 21:47:24.314: ERROR/AndroidRuntime(335): java.lang.NullPointerException
05-04 21:47:24.314: ERROR/AndroidRuntime(335):     at com.jacksmartie.PhotoMem.MainActivity$1.onItemClick(MainActivity.java:79)
05-04 21:47:24.314: ERROR/AndroidRuntime(335):     at android.widget.AdapterView.performItemClick(AdapterView.java:284)
05-04 21:47:24.314: ERROR/AndroidRuntime(335):     at android.widget.AbsListView$PerformClick.run(AbsListView.java:1696)
05-04 21:47:24.314: ERROR/AndroidRuntime(335):     at android.os.Handler.handleCallback(Handler.java:587)
05-04 21:47:24.314: ERROR/AndroidRuntime(335):     at android.os.Handler.dispatchMessage(Handler.java:92)
05-04 21:47:24.314: ERROR/AndroidRuntime(335):     at android.os.Looper.loop(Looper.java:123)
05-04 21:47:24.314: ERROR/AndroidRuntime(335):     at android.app.ActivityThread.main(ActivityThread.java:4627)
05-04 21:47:24.314: ERROR/AndroidRuntime(335):     at java.lang.reflect.Method.invokeNative(Native Method)
05-04 21:47:24.314: ERROR/AndroidRuntime(335):     at java.lang.reflect.Method.invoke(Method.java:521)
05-04 21:47:24.314: ERROR/AndroidRuntime(335):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
05-04 21:47:24.314: ERROR/AndroidRuntime(335):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
05-04 21:47:24.314: ERROR/AndroidRuntime(335):     at dalvik.system.NativeStart.main(Native Method)`

11290
2018-05-04 21:27


起源

请发一个logcat - JoxTraex
@JoxTraex:这是错误日志。我希望这是你正在寻找的。我不知道该把它放在哪里,所以我把它放在原来的帖子里。 - Jack Smartie
似乎我在Android应用程序中实现功能的初始方法并不是最好的方法。我将发布一个新问题,询问我应该如何解决这个问题。 - Jack Smartie
@JoxTraex,@ Tancho:哇哦!我想到了!有用!我用了 view = parent.getChildAt(i);。我很开心! - Jack Smartie
在找到视图setontent之前,您确定通过setContentView()或LayoutInflatore扩展了视图。 - neerajt


答案:


这条线是你罪魁祸首的一部分:

com.jacksmartie.PhotoMem.MainActivity$1.onItemClick(MainActivity.java:79)

在这里放一个断点:

Log.d("View 1", imageView.toString());

看看你的 imageview 引用对象[imageView]是,我希望它是null,因为你没有正确链接它。

如果为null,则表示您到参考视图的链接不正确。如果是这种情况,那么你需要正确分配它,如下所示:

Button b = findViewById(R.id.Button01);

然而;因为你正在使用似乎是一个 ListView,拉的那个略有不同。这意味着你拉动视图的方式是错误的,做一些研究,应该找到一些东西来帮助清除它!


8
2018-05-04 21:53



@JoxTraex:是的,是的 imageView.setBackgroundColor(Color.BLUE);。这就是它总是崩溃的地方。当我注释掉设置背景颜色的线条时,它可以正常工作。我怀疑是因为我的 findViewWithTag 方法不返回可用的东西。 - Jack Smartie
@JoxTraex:我试过把断点放在 Log.d 线。无论如何,android模拟器崩溃了。我想我不知道如何正确设置它。我对编程还很陌生。您可能没错,我没有正确引用或拉动视图。但我不能用 findViewById 因为我的 imageViews 使用动态资源。换句话说,我正在扫描文件系统中的图像并将它们加载到我的文件系统中 imageViews。所以,没有预先确定的 R.id's 使用。 - Jack Smartie
@Jack Smartie,因为它崩溃了你现在知道其他东西崩溃了,确保你的按钮被正确分配了一个点击监听器..如果你没有那么监听器将为null并且null不能成为监听器所以你'我会得到一个例外。 - JoxTraex
@JoxTraex:我认为我不知道如何正确设置断点或其他东西。我尝试移动断点,它只是跳过它。但错误日志一直说这是崩溃程序的同一行 - 当我尝试引用一个视图时 findViewWithTag。 - Jack Smartie
你确实在调试模式下运行程序吗? - JoxTraex


好吧,你没有说它崩溃的地方。目前还不清楚你在做什么。

public View getView(int position, View view, ViewGroup parent) {
    imageView.setTag(position);
    return imageView;

哪里 imageView 声明?这是什么设置的?

private OnItemClickListener itemClickListener = new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {

                        ImageView imageView;
                        //Variable i, here, is from a for loop.
                        imageView = (ImageView)v.findViewWithTag(i);

你正在声明一个名为的第二个局部变量 imageView 在这里,但是当你退出范围时它会消失。如果你依靠它来设置你以前的 imageView 变量,你将没有快乐。 i 来自一个 for 循环,但这与如何相关 position 在里面 getView() 方法?


4
2018-05-04 21:39



嗨,谢谢你的回复。对不起,我删除了一些代码,以减少它的混乱。在里面 onItemClick() 功能,我已发表评论 // 描述程序崩溃的位置。我将添加一些我删除的代码以使其更清晰。 - Jack Smartie


nullpointer发生是因为imageView变量空间是null,因为findviewbyid没有找到视图,所以你应该检查它是否为null,Android Log失败,因为它无法打印空变量,而不是设置标记,尝试设置ID做的

imageView.setId(位置);

如果我理解正确,你不使用适配器中的ID,因为生成视图默认情况下它没有。 标记主要用于放置视图所需的对象,它自己作为辅助变量,因此请务必使用它:)

如果你明确需要使用标签,那么检查视图是否确实在那里,这意味着检查你是不是一直在某处重新编写标签......


2
2018-05-04 22:59



@JoxTraex:调试模式显示findViewById或findViewWithTag检索的视图为null。我不确定为什么它是空的。是因为我没有使用正确的代码检索它吗?或者是因为GridView不允许您检索传递给其onItemClick()函数的视图以外的视图? - Jack Smartie