【问题标题】:Android - Toggle visible/invisible on multiple imageviews via their ID or TAGAndroid - 通过 ID 或 TAG 在多个图像视图上切换可见/不可见
【发布时间】:2012-04-21 08:13:15
【问题描述】:

我有四个图像视图,它们在活动开始时(或者更确切地说是在行膨胀时)设置为不可见。我想按下一个按钮,让它们都变得可见(并且随后可以作为 onclicks 操作......)。我有以下摘要代码,但每当我尝试访问除最后一个以外的任何其他图像视图时,我都会不断收到错误消息。

public class xx {

    private ImageView up;
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // Log.i(TAG, "excersizeAdapter getView");
            View v = convertView;
            if (v == null) {
                LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                v = vi.inflate(R.layout.row, null);
            }

            Excersize e = items.get(position);
            if (e != null) {
                TextView exTitle      = (TextView) v.findViewById(R.id.ex_type_title);
                TextView exOn         = (TextView) v.findViewById(R.id.ex_on_title);
                TextView exRestAmount = (TextView) v.findViewById(R.id.ex_rest_amount);
                TextView exSequence   = (TextView) v.findViewById(R.id.ex_sequence);

                up                    = (ImageView) v.findViewById(R.id.moveup);
                down                  = (ImageView) v.findViewById(R.id.movedown);

                if (exTitle !=null) {
                    exTitle.setText(e.getTypeTitle());
                }

                if (exOn !=null) {
                    exOn.setText("On: "+e.getTypeOn());
                }

                if (exRestAmount !=null) {
                    exRestAmount.setText(e.getRestAmount().toString());
                }

                if (exSequence !=null) {
                    exSequence.setText(e.getSequence().toString());
                    up.setTag(8881);
                    down.setTag(8882);

                    up.setId(((Integer)e.getSequence()));
                    down.setId(((Integer)e.getSequence()));

                    Log.i(TAG, "up,down values=" +e.getSequence());
                }
            }
            return v;
        }
    }

    public void toggleReorderButtons() {
        up.findViewById(2).setVisibility(View.VISIBLE);
        up.setVisibility(View.VISIBLE);
        up.setOnClickListener(this);
    }
}

好的,这是精简的代码,但在 makevisinvis 方法up.findview... 中它会导致崩溃,并且 up.setvis 等将仅打开添加到我的活动中的最后一个。

我也尝试了以下方法,但没有成功。

ImageView upper = (ImageView) up.findViewById(2);
upper.setVisibility(View.VISIBLE);

一个可爱的错误转储:

04-21 09:10:55.650: W/dalvikvm(22392): threadid=1: thread exiting with uncaught exception (group=0x4001e578)
04-21 09:10:55.675: E/AndroidRuntime(22392): FATAL EXCEPTION: main
04-21 09:10:55.675: E/AndroidRuntime(22392): java.lang.NullPointerException
04-21 09:10:55.675: E/AndroidRuntime(22392):     at com.mediabarltd.digittrainer.ProgramDisplay.toggleReorderButtons(ProgramDisplay.java:437)
04-21 09:10:55.675: E/AndroidRuntime(22392):     at com.mediabarltd.digittrainer.ProgramDisplay.onClick(ProgramDisplay.java:391)
04-21 09:10:55.675: E/AndroidRuntime(22392):     at android.view.View.performClick(View.java:2538)
04-21 09:10:55.675: E/AndroidRuntime(22392):     at android.view.View$PerformClick.run(View.java:9152)
04-21 09:10:55.675: E/AndroidRuntime(22392):     at android.os.Handler.handleCallback(Handler.java:587)
04-21 09:10:55.675: E/AndroidRuntime(22392):     at android.os.Handler.dispatchMessage(Handler.java:92)
04-21 09:10:55.675: E/AndroidRuntime(22392):     at android.os.Looper.loop(Looper.java:130)
04-21 09:10:55.675: E/AndroidRuntime(22392):     at android.app.ActivityThread.main(ActivityThread.java:3691)
04-21 09:10:55.675: E/AndroidRuntime(22392):     at java.lang.reflect.Method.invokeNative(Native Method)
04-21 09:10:55.675: E/AndroidRuntime(22392):     at java.lang.reflect.Method.invoke(Method.java:507)
04-21 09:10:55.675: E/AndroidRuntime(22392):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907)
04-21 09:10:55.675: E/AndroidRuntime(22392):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665)
04-21 09:10:55.675: E/AndroidRuntime(22392):     at dalvik.system.NativeStart.main(Native Method)

我花了一些认真的时间和对我正在做的事情进行彻底的返工。但是……

基本上我遵循了教程Android ListView and ListActivity,然后实现了Android ListView Adapter OnClickListener issue中描述的简洁的“技巧”。

(我真的很难接受。)

【问题讨论】:

  • 根据发布的日志,NPE 不会发生在“makevisinvis”中。你能再检查一下吗?另外,您可以发布定义/初始化上下对象的代码/
  • 对不起,我的例子很愚蠢,我在 SO 上写出来时更改了方法名称。我会更新....

标签: android imageview


【解决方案1】:

您将up 定义为类成员,并在每次调用getView 时重新初始化它——因此它始终指向创建的最后一个图像视图。另外,我不确定调用upfindViewById 是否正确:而是将其OnClickListener 设置在getView 内,并且每当单击时,在它所属的布局中查找所需的视图。

【讨论】:

  • 我认为你正在做一些事情。我刚刚做了一些检查,ID 始终是 id 设置的最后一个。它必须覆盖其他人..
  • 感谢您的帮助,我现在已经整理出我的代码并将我的解决方案包含在我的原始帖子中。
【解决方案2】:

你必须给 ImageView 一个 ID,比如

android:id="@+id/some_name"

然后像这样找到它:

up.findViewById(R.id.some_name);

【讨论】:

  • 我已经在初始膨胀过程中这样做了“up = (ImageView) v.findViewById(R.id.moveup);”这是你的意思,还是我需要再做一次?完成此操作后,我分配了 ID,并认为我可以使用它来引用它? (我也在上面添加了这一行)
  • 我如何分别引用图像视图的每个版本?我以为这就是 setId 的用武之地?
  • 在构建我的行数据的“public View getView”中,我使用数据库中的一个唯一字段并将其分配给 up imageview 的 ID。这是设置 ID 唯一的,不是吗?
  • 先用setTag方法,再用getTag方法。
  • @ZazGmy 这是我探索的第一个途径,但我找不到如何“使用”getTag。即 up.getTag(8881).setvisible(View.VISIBLE);对我来说不存在吗?
【解决方案3】:

使用这个:

int i = (int) up.getTag();
if (i == 8881) {
    //Do something here
}

【讨论】:

  • 好的,我可以看到它如何影响我的标签的存在,但是使用它如何将我的所有 4 个图像视图设置为可见?
  • 获取每个图像视图的标签并使用嵌套条件。
猜你喜欢
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 2022-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多