【问题标题】:Android: How to use View's setTag, getTag and findViewWithTag methods?Android:如何使用 View 的 setTag、getTag 和 findViewWithTag 方法?
【发布时间】:2021-12-29 06:18:33
【问题描述】:

我的 Android 应用程序的一段代码遇到了一些问题。在尝试设置 ImageView 对象的背景时,我不断收到 NullPointerException

代码如下:

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)`

【问题讨论】:

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

标签: android


【解决方案1】:

这条线是你的罪魁祸首:

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

在此处设置断点:

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

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

如果它为空,这意味着您指向参考视图的链接不正确。如果是这种情况,那么您需要像这样正确分配它:

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

但是;由于您使用的似乎是ListView,因此其拉动方式略有不同。这意味着你拉视图的方式是错误的,做一些研究,应该找到一些东西来帮助解决这个问题!

【讨论】:

  • @JoxTraex:是的,它是imageView.setBackgroundColor(Color.BLUE);。那就是它总是崩溃的地方。当我注释掉设置背景颜色的行时,它可以工作。我怀疑这是因为我的 findViewWithTag 方法没有返回可用的东西。
  • @JoxTraex:我尝试在Log.d 行设置断点。无论如何,android模拟器崩溃了。我想我不知道如何正确设置它。我对编程还是很陌生。您可能是对的,我没有正确引用或拉动视图。但我不能使用findViewById,因为我的imageViews 使用动态资源。换句话说,我正在扫描文件系统中的图像并将它们加载到我的imageViews 中。所以,没有预定的R.id's 可以使用。
  • @Jack Smartie ,好吧,既然它崩溃了,你现在知道它崩溃了,请确保你的按钮被正确分配了一个点击监听器。如果你不这样做,那么监听器将为 null 并且null 不能是监听器,所以你会得到一个异常。
  • @JoxTraex:我认为是我不知道如何正确设置断点之类的。我尝试移动断点,它只是跳过它。但是错误日志一直说这是导致程序崩溃的同一行 - 当我尝试通过 findViewWithTag 引用视图时。
  • @JoxTraex:哎呀。对不起,我还在学习。我在调试模式下运行它,它很有帮助。我仍然没有解决问题,但这是朝着正确方向迈出的一步。
【解决方案2】:

好吧,你没有说它在哪里崩溃。而且不清楚你在做什么。

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 循环,但这与getView() 方法中的position 有什么关系?

【讨论】:

  • 您好,感谢您的回复。对不起,我删除了一些代码以使其不那么混乱。在onItemClick() 函数中,我在// 中放置了描述程序崩溃位置的cmets。我将添加一些我删除的代码以使其更清晰。
【解决方案3】:

出现空指针是因为imageView变量为空,因为findViewById没有找到视图,所以你应该检查它是否为空。
Android Log 失败,因为它无法打印空变量,而不是设置标签,尝试通过以下方式设置 ID:

imageView.setId(位置);

如果我理解正确,您没有在适配器中使用 ID,并且由于视图是生成的,因此默认情况下它没有。 Tag 主要用于将 View 所需的对象作为辅助变量,因此请谨慎使用 :)

如果您明确需要使用标签,请检查视图是否确实存在,这意味着检查您是否没有在途中的某个地方重写标签...

【讨论】:

  • @JoxTraex:调试模式显示 findViewById 或 findViewWithTag 检索到的视图为空。我不确定为什么它是空的。是因为我没有使用正确的代码检索它吗?还是因为 GridView 不允许您检索传递给其 onItemClick() 函数的视图以外的视图?
猜你喜欢
  • 2011-07-14
  • 1970-01-01
  • 1970-01-01
  • 2014-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-29
  • 2019-11-08
相关资源
最近更新 更多