web-dev-qa-db-ja.com

レイアウト内のすべての子ビューを無効にする

質問を投稿する前に、これに関連する多くのスレッドを見ました。しかし、誰も私のために働いていませんでした。子として他の多くのレイアウトとフラグメントを持つRelativeLayoutがあります。ボタンをクリックすると、「content_view」のすべての子とcontent_view自体が無効になります。私は試した

contentView.setDisabled(false);

これはうまくいきませんでした。私も試しました

for (int i = 0; i < layout.getChildCount(); i++) {
    View child = layout.getChildAt(i);
    child.setEnabled(false);
}

これでもうまくいきませんでした。私は何が間違っているのですか?以下の私の.xmlコードを見つけてください。すべてのビューの上にビューを配置してみました。それでも私の問題は解決しませんでした。

<RelativeLayout
    Android:layout_height="match_parent"
    Android:layout_width="match_parent"
    Android:orientation="vertical"
    Android:id="@+id/content_view"
    Android:background="#ffffff">

    <LinearLayout
        Android:orientation="vertical"
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent"
        Android:layout_below="@+id/channel_actionbar"
        Android:layout_marginLeft="0dp"
        Android:layout_marginTop="0dp"
        Android:duplicateParentState="true">

        <FrameLayout
            Android:layout_height="match_parent"
            Android:layout_width="match_parent"
            Android:id="@+id/body_container"
            Android:layout_below="@+id/channel_actionbar"
            Android:duplicateParentState="true">

            <RelativeLayout
                Android:layout_height="match_parent"
                Android:layout_width="match_parent"
                Android:id="@+id/channelList"
                Android:duplicateParentState="true">

                <com.mobile.subview.ScrollViewWithScrollListener
                    Android:layout_width="match_parent"
                    Android:layout_height="match_parent"
                    Android:id="@+id/scrollView"
                    Android:layout_alignParentTop="false"
                    Android:duplicateParentState="true">

                    <RelativeLayout
                        Android:orientation="vertical"
                        Android:layout_width="fill_parent"
                        Android:layout_height="fill_parent"
                        Android:duplicateParentState="true">

                        <FrameLayout
                            Android:layout_width="fill_parent"
                            Android:layout_height="fill_parent"
                            Android:id="@+id/imagePlaceHolder"
                            Android:duplicateParentState="true"></FrameLayout>

                        <TableLayout
                            Android:layout_width="match_parent"
                            Android:layout_height="wrap_content"
                            Android:id="@+id/channelTable"
                            Android:layout_below="@+id/imagePlaceHolder"
                            Android:duplicateParentState="true"></TableLayout>

                        <com.mobile.subview.CustomTextView
                            Android:layout_width="match_parent"
                            Android:layout_height="wrap_content"
                            Android:text="You do not qualify for any engagements or channels.  Please check back later."
                            app:typeface="fonts/HelveticaNeue"
                            app:customStyle="Regular"
                            Android:id="@+id/noChannelsMessage"
                            Android:textColor="#000"
                            Android:textSize="@dimen/contentTextSize"
                            Android:visibility="gone"
                            Android:duplicateParentState="true"/>
                    </RelativeLayout>
                </com.mobile.subview.ScrollViewWithScrollListener>

                <com.mobile.subview.ParallaxImage
                    Android:layout_width="match_parent"
                    Android:layout_height="wrap_content"
                    Android:id="@+id/header"
                    Android:adjustViewBounds="true"
                    Android:layout_alignParentTop="true"
                    Android:scaleType="fitStart"
                    Android:visibility="invisible"
                    Android:duplicateParentState="true"/>
            </RelativeLayout>

            <RelativeLayout
                Android:layout_height="match_parent"
                Android:layout_width="match_parent"
                Android:layout_below="@+id/channel_actionbar"
                Android:id="@+id/sibling_view"
                Android:visibility="gone"
                Android:duplicateParentState="true"></RelativeLayout>

        </FrameLayout>
    </LinearLayout>

    <RelativeLayout
        Android:orientation="vertical"
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent"
        Android:visibility="invisible"
        Android:id="@+id/retailersContainer"
        Android:layout_marginLeft="0dp"
        Android:duplicateParentState="true"
        Android:layout_below="@+id/channel_actionbar">

        <fragment
            Android:layout_width="fill_parent"
            Android:layout_height="wrap_content"
            Android:name="com.mobile.subview.List"
            Android:id="@+id/retailers"
            Android:duplicateParentState="true"/>

        <FrameLayout
            Android:layout_width="fill_parent"
            Android:layout_height="fill_parent"
            Android:layout_below="@+id/retailers"
            Android:id="@+id/retailerClickBlocker"
            Android:duplicateParentState="true"></FrameLayout>
    </RelativeLayout>

    <RelativeLayout
        Android:orientation="vertical"
        Android:layout_width="match_parent"
        Android:layout_height="@dimen/actionBarHeight"
        Android:layout_alignParentTop="true"
        Android:id="@+id/channel_actionbar"
        Android:background="#F8F8F8"
        Android:layout_marginLeft="0dp"
        Android:duplicateParentState="true">

        <ImageButton
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:src="@drawable/shared_navmenu_button"
            Android:id="@+id/show_menu_button"
            Android:layout_centerVertical="true"
            Android:background="@null"
            Android:scaleType="fitCenter"
            Android:layout_marginLeft='5px'
            Android:duplicateParentState="true"/>

        <com.mobile.subview.CustomTextView
            Android:id="@+id/channel_title"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_centerInParent="true"
            Android:textSize="@dimen/titleTextSize"
            Android:textColor="#000"
            Android:text="Test Title"
            app:typeface="fonts/HelveticaNeue"
            app:customStyle="Medium"
            Android:visibility="gone"
            Android:duplicateParentState="true"/>


        <ImageView
            Android:id="@+id/logo"
            Android:layout_height="wrap_content"
            Android:layout_width="wrap_content"
            Android:layout_centerInParent="true"
            Android:src="@drawable/shared_navbar_logo2x"
            Android:visibility="gone"
            Android:scaleType="fitCenter"
            Android:duplicateParentState="true"/>

        <com.mobile.subview.CustomButton
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_alignParentRight="true"
            Android:id="@+id/channel_done_btn"
            app:typeface="fonts/HelveticaNeue"
            app:customStyle="Regular"
            Android:visibility="gone"
            Android:duplicateParentState="true"/>

        <com.mobile.subview.CustomButton
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_alignParentRight="true"
            app:typeface="fonts/HelveticaNeue"
            app:customStyle="Regular"
            Android:id="@+id/channel_share_btn"
            Android:visibility="gone" />

        <RelativeLayout
            Android:layout_width="fill_parent"
            Android:layout_height="1dp"
            Android:background="#D6D6D6"
            Android:id="@+id/divider"
            Android:layout_alignParentBottom="true"
            Android:duplicateParentState="true"/>

    </RelativeLayout>

    <View
        Android:visibility="gone"
        Android:id="@+id/click_preventing_view"
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent"
        Android:background="#66000000"
        Android:clickable="false" />

</RelativeLayout>
15
Uma

レイアウトは非常にネストされているため、ビューを再帰的に無効にする必要があります。メソッドを使用する代わりに、次のようなものを試してください。

private static void disable(ViewGroup layout) {
    layout.setEnabled(false);
    for (int i = 0; i < layout.getChildCount(); i++) {
        View child = layout.getChildAt(i);
        if (child instanceof ViewGroup) {
            disable((ViewGroup) child);
        } else {
            child.setEnabled(false);
        }
    }
}

次に、電話します。

disable(content_view);
25
Haldean Brown

再帰を使用する代わりに答えが期待されているとしても、以下のコードでうまくいくと思います。これは私がそれを否定するために使用したものです。 parentlayoutを渡し、ブールパラメータとして表示するか非表示にするかを指定しました

private void disable(LinearLayout layout, boolean enable) {
        for (int i = 0; i < layout.getChildCount(); i++) {
            View child = layout.getChildAt(i);
            child.setEnabled(enable);
            if (child instanceof ViewGroup) {
                ViewGroup group = (ViewGroup) child;
                for (int j = 0; j < group.getChildCount(); j++) {
                    group.getChildAt(j).setEnabled(enable);
                }
            }

        }
3
Akshay Mukadam

Kotlinのバージョンは次のとおりです。

使用 Android KTX

fun View.changeEnableChildren(enable: Boolean) {
    isEnabled = enable
    (this as? ViewGroup)?.let {
        forEach {
            changeEnableChildren(enable)
        }
    }
}

なし Android KTX

fun View.changeEnableChildren(enable: Boolean) {
    isEnabled = enable
    (this as? ViewGroup)?.let {
        for (i in 0..it.childCount) {
            changeEnableChildren(enable)
        }           
    }
}

注:再帰メソッドは StackOverFlowErrorを引き起こす可能性があります。その場合、changeEnableChildren(enable)isEnabled=enableに置き換える必要があります。

0
sma6871