setVisibility无效

3
这是我的布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/day_frame"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="4dip"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:orientation="vertical"
        android:padding="2dip" >

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="1dip" >

            <ImageView
                android:id="@+id/imageView1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginRight="1dip"
                android:src="@drawable/marca_bike_event" />

            <ImageView
                android:id="@+id/imageView2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginRight="1dip"
                android:src="@drawable/marca_bike_event" />

            <ImageView
                android:id="@+id/imageView3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginRight="1dip"
                android:src="@drawable/marca_bike_event" />

            <ImageView
                android:id="@+id/imageView4"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginRight="1dip"
                android:src="@drawable/marca_bike_event" />

            <ImageView
                android:id="@+id/imageView5"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginRight="1dip"
                android:src="@drawable/marca_bike_event" />

            <ImageView
                android:id="@+id/imageView6"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/marca_bike_event" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="1dip" >

            <ImageView
                android:id="@+id/imageView7"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginRight="1dip"
                android:src="@drawable/marca_bike_event" />

            <ImageView
                android:id="@+id/imageView8"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginRight="1dip"
                android:src="@drawable/marca_bike_event" />

            <ImageView
                android:id="@+id/imageView9"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginRight="1dip"
                android:src="@drawable/marca_bike_event" />

            <ImageView
                android:id="@+id/imageView10"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginRight="1dip"
                android:src="@drawable/marca_bike_event" />

            <ImageView
                android:id="@+id/imageView11"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginRight="1dip"
                android:src="@drawable/marca_bike_event" />

            <ImageView
                android:id="@+id/imageView12"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/marca_bike_event" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" >

            <ImageView
                android:id="@+id/imageView13"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginRight="1dip"
                android:src="@drawable/marca_bike_event" />

            <ImageView
                android:id="@+id/imageView14"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginRight="1dip"
                android:src="@drawable/marca_bike_event" />

            <ImageView
                android:id="@+id/imageView15"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginRight="1dip"
                android:src="@drawable/marca_bike_event" />

            <ImageView
                android:id="@+id/imageView16"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginRight="1dip"
                android:src="@drawable/marca_bike_event" />

            <ImageView
                android:id="@+id/imageView17"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginRight="1dip"
                android:src="@drawable/marca_bike_event" />

            <ImageView
                android:id="@+id/imageView18"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/marca_bike_event" />
        </LinearLayout>

        <TextView
            android:id="@+id/day_number"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="2dip"
            android:gravity="right|bottom"
            android:textSize="18sp"
            android:textStyle="bold" />
    </LinearLayout>

</RelativeLayout>

这是我的自定义视图

import java.util.Calendar;

public class DayView extends LinearLayout {

    private final boolean belongsToMonth;
    private final TextView numberView;
    private int racesNum = 0;
    private final ImageView iv1, iv2, iv3, iv4, iv5, iv6, iv7, iv8, iv9, iv10,
    iv11, iv12, iv13, iv14, iv15, iv16, iv17, iv18;

    public DayView(final Context context, final Calendar moving,
            final SingleCalendar calendar) {
        super(context);
        View.inflate(context, R.layout.calendar_week_day, this);
        iv1 = (ImageView) findViewById(R.id.imageView1);
        iv2 = (ImageView) findViewById(R.id.imageView2);
        iv3 = (ImageView) findViewById(R.id.imageView3);
        iv4 = (ImageView) findViewById(R.id.imageView4);
        iv5 = (ImageView) findViewById(R.id.imageView5);
        iv6 = (ImageView) findViewById(R.id.imageView6);
        iv7 = (ImageView) findViewById(R.id.imageView7);
        iv8 = (ImageView) findViewById(R.id.imageView8);
        iv9 = (ImageView) findViewById(R.id.imageView9);
        iv10 = (ImageView) findViewById(R.id.imageView10);
        iv11 = (ImageView) findViewById(R.id.imageView11);
        iv12 = (ImageView) findViewById(R.id.imageView12);
        iv13 = (ImageView) findViewById(R.id.imageView13);
        iv14 = (ImageView) findViewById(R.id.imageView14);
        iv15 = (ImageView) findViewById(R.id.imageView15);
        iv16 = (ImageView) findViewById(R.id.imageView16);
        iv17 = (ImageView) findViewById(R.id.imageView17);
        iv18 = (ImageView) findViewById(R.id.imageView18);
        final ImageView[] views = new ImageView[] { iv1, iv2, iv3, iv4, iv5,
                iv6, iv7, iv8, iv9, iv10, iv11, iv12, iv13, iv14, iv15, iv16,
                iv17, iv18 };
        for (final ImageView v : views) {
            v.setVisibility(View.INVISIBLE);
        }

        numberView = (TextView) findViewById(R.id.day_number);
        numberView.setText(Integer.toString(moving.get(Calendar.DAY_OF_MONTH)));
        setTag(moving.clone());
        belongsToMonth = (moving.get(Calendar.MONTH) == calendar.current
                .get(Calendar.MONTH));
        final Resources res = getResources();
        if (!belongsToMonth) {
            numberView.setTextColor(res
                    .getColor(R.color.calendar_unbelonging_dayview_text));
            setBackgroundResource(R.drawable.unbelonging_dayview);
        } else {
            numberView.setTextColor(res
                    .getColor(R.color.calendar_belonging_dayview_text));
            setBackgroundResource((DateParseUtils.areEqualDays(moving,
                    calendar.today)) ? R.drawable.selected_dayview
                            : R.drawable.unselected_dayview);
        }
    }

    protected void onMeasure(final int widthMeasureSpec,

    public boolean belongsToMonth() {

    public Calendar getCalendar() {

    public void addRace(final ParseObject carrera) {
        final ImageView[] views = new ImageView[] { iv1, iv2, iv3, iv4, iv5,
                iv6, iv7, iv8, iv9, iv10, iv11, iv12, iv13, iv14, iv15, iv16,
                iv17, iv18 };


        if (racesNum < views.length) {
            final ImageView iv = views[racesNum];
            final int id = getRaceId(carrera);
            iv.setImageDrawable(getContext().getResources().getDrawable(id));
            for (int i = 0; i < views.length; i++) {
                final ImageView iv2 = views[i];
                if (i <= racesNum) {
                    iv2.setVisibility(View.VISIBLE);
                } else {
                    iv2.setVisibility(View.INVISIBLE);
                }
            }
            racesNum++;
        }

    }

    private int getRaceId(final ParseObject carrera) {

        final String disciplina = carrera.getString("disciplinaId");
        if (disciplina.equals(SettingsActivity.ID_BIKE_EVENT)) {
            return R.drawable.marca_bike_event;
        } else if (disciplina.equals(SettingsActivity.ID_BMX)) {
            return R.drawable.marca_bmx;
        } else if (disciplina.equals(SettingsActivity.ID_ENDURO)) {
            return R.drawable.marca_enduro;
        } else if (disciplina.equals(SettingsActivity.ID_FREESTYLE)) {
            return R.drawable.marca_freestyle;
        } else if (disciplina.equals(SettingsActivity.ID_MOTO_GP)) {
            return R.drawable.marca_moto_gp;
        } else if (disciplina.equals(SettingsActivity.ID_MOTOCROSS)) {
            return R.drawable.marca_motocross;
        } else if (disciplina.equals(SettingsActivity.ID_MOTORBIKE_RALLY)) {
            return R.drawable.marca_mc_rally;
        } else if (disciplina.equals(SettingsActivity.ID_MTB_4X)) {
            return R.drawable.marca_mtb_4x;
        } else if (disciplina.equals(SettingsActivity.ID_MTB_DH)) {
            return R.drawable.marca_mtb_dh;
        } else if (disciplina.equals(SettingsActivity.ID_MTB_ENDURO)) {
            return R.drawable.marca_mtb_enduro;
        } else if (disciplina.equals(SettingsActivity.ID_QUADCROSS)) {
            return R.drawable.marca_quad_cross;
        } else if (disciplina.equals(SettingsActivity.ID_SUPERBIKE)) {
            return R.drawable.marca_superbike;
        } else if (disciplina.equals(SettingsActivity.ID_SUPERMOTO)) {
            return R.drawable.marca_supermoto;
        } else if (disciplina.equals(SettingsActivity.ID_TRIAL)) {
            return R.drawable.marca_trial;
        } else if (disciplina.equals(SettingsActivity.ID_URBAN_DH)) {
            return R.drawable.marca_urban_dh;
        } else if (disciplina.equals(SettingsActivity.ID_XC_RALLIES)) {
            return R.drawable.marca_xc_rallies;
        }
        return R.drawable.marca_other_event;
    }

}
addRace是从AsyncTaskOnPostExecute方法中调用的。然而,它不会使任何ImageView可见。我在setVisibility行上设置断点进行了调试,它实际上在主线程上调用了setVisibility,但它只是不起作用。尝试更改ImageView drawable也不起作用。
我已经尝试在构造函数中设置其可见性并更改可绘制对象,它可以工作。似乎setVisibility方法只是无所作为。
我是否漏掉了什么?

在调用set-visibility和get方法时,您是否遇到了后台方面的任何问题? - itsrajesh4uguys
不是的。我只是在后台调用服务器,然后在响应时设置视图的可见性。调用已经完成了,唯一尴尬的事情是视图在View构造函数之外不改变其可见性或不做出任何响应。 - Charlie-Blake
3个回答

1

好的,问题解决了。

我的DayView是在ArrayAdapter<Calendar>上动态创建的。我所要做的就是在ArrayAdaptergetView方法中进行所有视图操作,然后调用adapter.notifyDataSetChanged()而不是直接尝试修改它们。

此外,我还必须使用ViewHolder模式才能正确完成修改。


0

在我遇到问题时总是奏效的最后一招

.setVisibility(VISIBLE/INVISIBLE/GONE) ;

无法将我的布局添加/删除到已连接的ViewGroup中。请将此发布到View线程中,它会完成工作:
m_viewIsVisible=/false/true; //set before hand

public void run()
{    
    try
    {
       if (!m_viewIsVisible)
           RootView.rootGroop().removeView(currentLayout);
       else
           RootView.rootGroop().addView(currentLayout);

    } catch (Exception ex)
    {
        Log.e(TAG, "-Add/Remove layout throws exception:: " + ex.toString());
    }
}

这里的currentLayout是您想要显示/隐藏的固定布局。RootView.rootGroop()可以获取当前布局所属的ViewGroup。 您应该自己编写逻辑来保持并获取对父ViewGroup的引用。


0

你试图从后台的异步线程中设置ImageView的可见性。 你不能直接从后台线程访问视图!

你可以使用Handler,并在下一个方法中更新你的视图的可见性。

public void handleMessage(Message msg) {
    super.handleMessage(msg);
    // update views here
}

或者您可以直接在您的代码中使用下面的示例代码:

    imageView.post(new Runnable() {
        @Override
        public void run() {
            imageView.setVisibility(View.VISIBLE));
        }
    });

不,我是在AsyncTask的onPostExecute方法中从主线程执行的,并且调试器实际上显示我正在主线程上。 - Charlie-Blake
我在处理中,测试完成后我会发布结果的;-) - Charlie-Blake
需要在工作后找时间在我的电脑上测试你的代码。 - Veaceslav Gaidarji

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