无法在自定义导航抽屉中设置按钮的文本
unable to setText of button in customized navigational drawer
我制作了一个带有 3 个按钮的 自定义导航抽屉 ,我想根据它们关联的 activity 更改按钮上的文本。因此,当我使用 LayoutInflater 创建导航抽屉布局的 java 对象并使用该布局对象上的 findViewById 获取每个按钮的句柄时,我设置了每个按钮的文本但是当我 运行 应用程序时文本没有出现(在XML中我没有为按钮设置任何文本)。其余一切正常。
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.sahil.childcare.NavigationalDrawerFragment">
<RelativeLayout
android:layout_height="wrap_content"
android:layout_width="match_parent">
<include
layout="@layout/nav_profile"
android:id="@+id/nav_profile"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/nav_profile"
android:layout_marginLeft="-5dip"
android:layout_marginRight="-5dip"
android:layout_marginTop="-5dip"
android:layout_marginBottom="-5dip"
android:id="@+id/top_button"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/top_button"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_marginLeft="-5dip"
android:layout_marginRight="-5dip"
android:layout_marginTop="-7dip"
android:layout_marginBottom="-5dip"
android:id="@+id/middle_button" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/middle_button"
android:id="@+id/bottom_button"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_marginLeft="-5dip"
android:layout_marginRight="-5dip"
android:layout_marginTop="-7dip"
android:layout_marginBottom="-5dip"/>
</RelativeLayout>
</FrameLayout>
部分代码在main activity(onCreate()方法里面) 涉及这个抽屉在这里
LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.fragment_navigational_drawer,null);
Button topButton = (Button) view.findViewById(R.id.top_button);
Button middleButton = (Button) view.findViewById(R.id.middle_button);
Button bottomButton = (Button) view.findViewById(R.id.bottom_button);
topButton.setText("School");
topButton.setTextColor(getResources().getColor(R.color.red));
middleButton.setText("Teacher");
middleButton.setTextColor(getResources().getColor(R.color.red));
bottomButton.setText("Child");
bottomButton.setTextColor(getResources().getColor(R.color.red));
首先我会检查按钮是否在屏幕上可见。
为此,您可以为它们设置一些颜色背景,例如:
android:background="#ff0000"
并使用 hierarchy-viewer 确保您的按钮出现在您希望它们出现的位置。
接下来要检查的是新膨胀的 fragment_navigational_drawer
是否真的被用于导航抽屉,或者它可能是此布局的不同实例,为此您可以添加一些日志记录到 inflation 代码,打印您放在屏幕上的特定实例,并在层次结构查看器中验证您在屏幕上看到正确的实例。
更新:
为了答案的完整性,根据下面的评论,如果您已经通过 xml 添加了布局(例如使用 <include>
),而不是在代码中膨胀它:
View view = inflater.inflate(R.layout.fragment_navigational_drawer,null);
您需要通过以下方式获取已经膨胀的布局的句柄:
View view = findViewById(R.id.my_navigational_drawer);
我制作了一个带有 3 个按钮的 自定义导航抽屉 ,我想根据它们关联的 activity 更改按钮上的文本。因此,当我使用 LayoutInflater 创建导航抽屉布局的 java 对象并使用该布局对象上的 findViewById 获取每个按钮的句柄时,我设置了每个按钮的文本但是当我 运行 应用程序时文本没有出现(在XML中我没有为按钮设置任何文本)。其余一切正常。
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.sahil.childcare.NavigationalDrawerFragment">
<RelativeLayout
android:layout_height="wrap_content"
android:layout_width="match_parent">
<include
layout="@layout/nav_profile"
android:id="@+id/nav_profile"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/nav_profile"
android:layout_marginLeft="-5dip"
android:layout_marginRight="-5dip"
android:layout_marginTop="-5dip"
android:layout_marginBottom="-5dip"
android:id="@+id/top_button"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/top_button"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_marginLeft="-5dip"
android:layout_marginRight="-5dip"
android:layout_marginTop="-7dip"
android:layout_marginBottom="-5dip"
android:id="@+id/middle_button" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/middle_button"
android:id="@+id/bottom_button"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_marginLeft="-5dip"
android:layout_marginRight="-5dip"
android:layout_marginTop="-7dip"
android:layout_marginBottom="-5dip"/>
</RelativeLayout>
</FrameLayout>
部分代码在main activity(onCreate()方法里面) 涉及这个抽屉在这里
LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.fragment_navigational_drawer,null);
Button topButton = (Button) view.findViewById(R.id.top_button);
Button middleButton = (Button) view.findViewById(R.id.middle_button);
Button bottomButton = (Button) view.findViewById(R.id.bottom_button);
topButton.setText("School");
topButton.setTextColor(getResources().getColor(R.color.red));
middleButton.setText("Teacher");
middleButton.setTextColor(getResources().getColor(R.color.red));
bottomButton.setText("Child");
bottomButton.setTextColor(getResources().getColor(R.color.red));
首先我会检查按钮是否在屏幕上可见。 为此,您可以为它们设置一些颜色背景,例如:
android:background="#ff0000"
并使用 hierarchy-viewer 确保您的按钮出现在您希望它们出现的位置。
接下来要检查的是新膨胀的 fragment_navigational_drawer
是否真的被用于导航抽屉,或者它可能是此布局的不同实例,为此您可以添加一些日志记录到 inflation 代码,打印您放在屏幕上的特定实例,并在层次结构查看器中验证您在屏幕上看到正确的实例。
更新:
为了答案的完整性,根据下面的评论,如果您已经通过 xml 添加了布局(例如使用 <include>
),而不是在代码中膨胀它:
View view = inflater.inflate(R.layout.fragment_navigational_drawer,null);
您需要通过以下方式获取已经膨胀的布局的句柄:
View view = findViewById(R.id.my_navigational_drawer);