切换视图可见性

Toggle View Visibility

我发现了很多关于 View visibility 的问题。我已经知道 .GON​​E 和 .INVISIBLE 之间的区别。我不知道的是如何进行适当的切换以使它们 .VISIBLE/.GONE 每当单击按钮时。

这是我 need:I 有一个 linear layout,里面有一些 buttons。我首先需要将它们 buttons 隐藏起来,所以我将 linear layout 设置为消失:

<LinearLayout
    android:id="@+id/feelings_layout"
    android:layout_below="@+id/feeling_btn"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:visibility="gone">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <Button
            android:id="@+id/happy_btn"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="46dp"
            android:text="Happy"/>
        <Button
            android:id="@+id/sad_btn"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="46dp"
            android:text="Sad"/>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <Button
            android:id="@+id/love_btn"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="46dp"
            android:text="in love"/>
        <Button
            android:id="@+id/mad_btn"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="46dp"
            android:text="mad"/>
    </LinearLayout>

</LinearLayout>

然后我在单击按钮时生成 .VISIBLE,在按下相同的 button 时再次生成 .GONE

Button feelingsButton = (Button)contentView.findViewById(R.id.feeling_btn);
    feelingsButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(context, "button clicked", Toast.LENGTH_LONG).show();
            feelingsButtonsLayout = (LinearLayout)contentView.findViewById(R.id.feelings_layout);
            if(feelingsButtonsLayout.getVisibility() == View.GONE){
                Log.d("-----------", "gone");
                feelingsButtonsLayout.setVisibility(View.VISIBLE);

            }else{
                Log.d("-----------", "not gone");
                for ( int i = 0; i < feelingsButtonsLayout.getChildCount();  i++ ){
                    View view = feelingsButtonsLayout.getChildAt(i);
                    view.setVisibility(View.GONE);
                }
                feelingsButtonsLayout.setVisibility(View.GONE);
            }
        }
    });

一切似乎都正常,但是当我第三次单击同一个按钮时,希望它能够进行布局 VISIBLE,即使我的 log 说它也不会再次出现视图是 gone(仅查看 Logcat,它似乎工作正常)。

对此有什么想法吗?

您必须再次设置第二次点击时设置为 GONE 的所有按钮的可见性,因为

第一次点击 => 将布局设​​置为可见并且所有按钮都已可见

第二次点击 => 设置布局以及所有按钮

第三次点击 => 将布局设​​置为可见,但按钮仍然不可见,这些按钮在第二次点击时设置为消失

  if(feelingsButtonsLayout.getVisibility() == View.GONE){
                Log.d("-----------", "gone");
                for ( int i = 0; i < feelingsButtonsLayout.getChildCount();  i++ ){
                    View view = feelingsButtonsLayout.getChildAt(i);
                    view.setVisibility(View.VISIBLE);
                }
                feelingsButtonsLayout.setVisibility(View.VISIBLE);

            }else{
                Log.d("-----------", "not gone");
                for ( int i = 0; i < feelingsButtonsLayout.getChildCount();  i++ ){
                    View view = feelingsButtonsLayout.getChildAt(i);
                    view.setVisibility(View.GONE);
                }
                feelingsButtonsLayout.setVisibility(View.GONE);
            } 

您可以删除两个循环并简单地设置您的 container 布局可见性

  if(feelingsButtonsLayout.getVisibility() == View.GONE){
                Log.d("-----------", "gone");
                feelingsButtonsLayout.setVisibility(View.VISIBLE);

            }else{
                Log.d("-----------", "not gone");
                feelingsButtonsLayout.setVisibility(View.GONE);
            } 

问题是您正在为所有单独的按钮设置 GONE,但只在布局上而不是在按钮上设置 VISIBLE

当父布局设置为GONE时,无需隐藏所有按钮。您可以从 else 案例

中删除以下代码
for ( int i = 0; i < feelingsButtonsLayout.getChildCount();  i++ ){
                View view = feelingsButtonsLayout.getChildAt(i);
                view.setVisibility(View.GONE);
            }