【问题标题】:can't set Visibility of ScrollView无法设置 ScrollView 的可见性
【发布时间】:2016-07-09 01:56:12
【问题描述】:

我制作了一个 XML 元素,它自动创建一个 Button,然后是一个带有 LinearLayout 的 ScrollView。 Button 在按下时应该会改变颜色并改变 ScrollView 的可见性。现在,它只改变了 Button 的颜色,但 Scroll View 中的 Text 保持可见。

这在我通过 XML 创建 Button 和 ScrollView 并通过主活动中的 onCreate() 方法创建 onClickListeners 之前有效。

我的代码:

public class AccordionWidget extends LinearLayout{


    public AccordionWidget(Context c, AttributeSet attrs) {
        super(c, attrs);

        final Context context = c;

        final Button btn = new Button(context);
        final LinearLayout ll = new LinearLayout(context);
        final ScrollView sv = new ScrollView(context);

        TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.accordion);

        LayoutParams btnparams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
        btn.setText(a.getString(R.styleable.accordion_text));
        btn.setBackgroundColor(ContextCompat.getColor(context, R.color.button_not_pressed));
        LayoutParams llparams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
        llparams.weight = 1f;
        LayoutParams swparams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);

        btn.setLayoutParams(btnparams);
        ll.setOrientation(LinearLayout.VERTICAL);
        ll.setLayoutParams(llparams);
        sv.setVisibility(View.GONE);
        sv.setLayoutParams(swparams);

        this.addView(sv);
        this.addView(btn);
        sv.addView(ll);

        btn.setOnClickListener(new OnClickListener() {
            boolean btnstate = false;
            @Override
            public void onClick(View v) {
                if (btnstate) {
                    btn.setBackgroundColor(ContextCompat.getColor(context, R.color.button_pressed));
                    sv.setVisibility(View.VISIBLE);
                    btnstate = false;
                } else {
                    btn.setBackgroundColor(ContextCompat.getColor(context, R.color.button_not_pressed));
                    sv.setVisibility(View.GONE);
                    btnstate = true;
                }
            }
        });

        a.recycle();
    }

}

【问题讨论】:

    标签: java android scrollview


    【解决方案1】:

    目前,您正在设置 ScrollView 的可见性,而不是其子级的可见性。您可以尝试单独隐藏ScrollView 的所有子项,如this answer 所示:

    for ( int i = 0; i < sv.getChildCount();  i++ ){
        View view = sv.getChildAt(i);
        view.setVisibility(View.GONE);
    }
    

    所以想法很简单:一个一个地获取孩子并设置可见性。当然,如果需要,您可以与孩子们一起做更多的事情。

    【讨论】:

    • 当视图不可见时,视图的所有子视图都是不可见的。在我通过 XML 创建 Button 和 ScrollView 并通过主要活动中的 'onCreate()' 方法创建 'onClickListeners' 之前,它工作过。
    • “之前”到底是什么意思?我不明白你到底改变了什么
    • 我从在 xml 文件中手动创建按钮、滚动视图和线性布局到制作我自己的 xml 元素并因此在上面看到的类中创建它们。
    • 啊,现在我明白了。创建自己的班级的原因是什么?只是代码可读性?
    • 那和学习。我对 android 很陌生,这是我的第一个项目。
    【解决方案2】:

    sv 的背景添加颜色。试试这个:

    final ScrollView sv = new ScrollView(context);
    sv.setBackgroundColor(0xffffff);//make it not transparent :)
    

    由于您的代码没有提及文本,所以我认为文本位于 scrollview 的不同层中,如果 scrollview 在其顶部,则通过设置 bgcolor 可以使文本变暗。

    【讨论】:

    • 滚动视图内部是线性布局,LL 中是文本视图。我明白你想要做什么,但出于我的目的,它不会做
    • 您为什么不尝试设置LL 的可见性,看看会发生什么?或将boolean btnstate 移动为全局变量
    • 我已经尝试设置 LL 的可见性,结果相同。我看不出改变布尔值的范围会如何影响结果。它仅与有效的 if 语句相关,因为每次按下按钮时都会切换颜色。只是滚动视图的可见性没有改变。
    【解决方案3】:

    您是否尝试过交换这两行:

    sv.setVisibility(View.GONE);
    sv.setLayoutParams(swparams);
    

    也许setLayoutParams 会覆盖setVisibility 设置的可见性

    【讨论】:

    • 试过了,好像没什么区别。这也无法解释为什么当我按下按钮时它不会改变可见性。还是谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    • 2015-05-02
    • 1970-01-01
    • 2012-12-14
    相关资源
    最近更新 更多