You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中Sheet2/Sheet3的Exit按钮无法正常启用问题求助

问题:Sheet2/Sheet3中退出按钮无法正常启用(仅Sheet1正常)

布局结构

activity_main.xml 中的包含布局

<include
    android:id="@+id/id_SubStationMenu"
    layout="@layout/locationmenu"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:visibility="gone"/>
<include
    android:id="@+id/id_Sheet1"
    layout="@layout/id_Sheet1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:visibility="gone"/>
<include
    android:id="@+id/id_Sheet2"
    layout="@layout/id_Sheet2"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:visibility="gone"/>
<include
    android:id="@id/id_Sheet3"
    layout="@layout/id_Sheet3"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:visibility="gone"/>

每个Sheet的布局(Sheet2/3结构与Sheet1一致)

<GridLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/id_Sheet1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="@android:color/white">
    <include
        layout="@layout/stationlog"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <HorizontalScrollView
        android:id="@+id/id_ScrollView"
        android:layout_width="match_parent"
        android:layout_height="640dp">
        <GridLayout
            android:id="@+id/id_GridLayoutInsideScrollView"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:orientation="vertical"
            android:rowCount="2">
            <include
                layout="@layout/patients"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
        </GridLayout>
    </HorizontalScrollView>
</GridLayout>

stationlog布局中的退出按钮

<Button
    android:id="@+id/id_ExitToMenu"
    android:layout_width="70dp"
    android:layout_height="35dp"
    android:text="@string/Exit"
    android:textSize="12dp"
    android:layout_gravity="top|left"
    android:enabled="false"/>

代码逻辑

页面切换判断与视图启用逻辑

if (location == "sheet1")
{
    EnableViews(activity, location);
}
else if (location == "sheet2")
{
    EnableViews(activity, location);
}
else if (location == "sheet3")
{
    EnableViews(activity, location);
}

// 启用视图的方法
private void EnableViews(Activity activity, string location)
{
    TextView title = activity.FindViewById<TextView>(Resource.Id.id_StationTitle);
    title.Text = location;
    // 注意:此处ID与布局中按钮ID不一致,属于笔误
    Button exitButton = activity.FindViewById<Button>(Resource.Id.id_ExitCountSheetButton);
    exitButton.Enabled = true;

    LinearLayout dateTimeName = activity.FindViewById<LinearLayout>(Resource.Id.id_DateTimeName);
    for (int i = 0; i < dateTimeName.ChildCount; i++)
    {
        View view = dateTimeName.GetChildAt(i);
        if (view is EditText editText)
            editText.Enabled = true;
    }
}

问题现象

  • Sheet1中的退出按钮可正常启用并交互
  • Sheet2/Sheet3中,调试显示代码已执行exitButton.Enabled = true,但按钮仍为灰色不可用状态
  • 三个Sheet的布局与代码逻辑几乎完全一致,仅ID区分

已尝试的解决方法

  • 将exitButton.Enabled = true移至判断逻辑外,确认所有Sheet都会触发该代码
  • 将stationlog布局移至主布局,让三个Sheet重叠显示
  • 调试确认按钮对象已获取且Enabled属性被设为true,但界面无变化

问题原因及解决方案

核心原因

  1. ID匹配冲突:直接调用activity.FindViewById会返回第一个匹配目标ID的视图,也就是Sheet1中的按钮。即使切换到Sheet2/3,代码修改的始终是Sheet1的按钮,当前显示的Sheet2/3中的按钮根本没被修改。
  2. 代码笔误:布局中按钮ID为id_ExitToMenu,但代码中使用的是id_ExitCountSheetButton,这会导致获取到错误的控件(甚至空指针,若该ID不存在)。

修复步骤

步骤1:修正按钮ID的笔误

将EnableViews方法中的按钮ID改为布局中实际的id_ExitToMenu:

Button exitButton = sheetRoot.FindViewById<Button>(Resource.Id.id_ExitToMenu);

步骤2:通过Sheet根视图获取子控件

修改调用逻辑,先获取当前Sheet的根视图,再通过根视图查找内部的控件,确保修改的是当前显示Sheet中的按钮:

View currentSheet = null;
if (location == "sheet1")
{
    currentSheet = activity.FindViewById<View>(Resource.Id.id_Sheet1);
}
else if (location == "sheet2")
{
    currentSheet = activity.FindViewById<View>(Resource.Id.id_Sheet2);
}
else if (location == "sheet3")
{
    currentSheet = activity.FindViewById<View>(Resource.Id.id_Sheet3);
}
if(currentSheet != null)
{
    EnableViews(currentSheet, location);
}

// 修改后的EnableViews方法
private void EnableViews(View sheetRoot, string location)
{
    TextView title = sheetRoot.FindViewById<TextView>(Resource.Id.id_StationTitle);
    title.Text = location;
    Button exitButton = sheetRoot.FindViewById<Button>(Resource.Id.id_ExitToMenu);
    exitButton.Enabled = true;

    LinearLayout dateTimeName = sheetRoot.FindViewById<LinearLayout>(Resource.Id.id_DateTimeName);
    for (int i = 0; i < dateTimeName.ChildCount; i++)
    {
        View view = dateTimeName.GetChildAt(i);
        if (view is EditText editText)
            editText.Enabled = true;
    }
}

步骤3:可选优化

可以将三个Sheet的显示/隐藏逻辑与控件初始化绑定,确保每次切换Sheet时,只操作当前显示的Sheet控件,避免无效操作。

内容的提问来源于stack exchange,提问作者Robert Green

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 14:16:01