我有子项的工具栏布局:
<md.fusionworks.paynet.ui.widget.PaynetToolbar xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:view="http://schemas.android.com/apk/res-auto"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:fitsSystemWindows="true"
android:popupTheme="@style/ThemeOverlay.AppCompat.Light"
android:theme="@style/ActionBarThemeOverlay">
<md.fusionworks.paynet.ui.widget.FontTextView
android:id="@+id/titleField"
style="@style/ModuleTitleTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
view:font="font/Circe-Light.otf" />
</md.fusionworks.paynet.ui.widget.PaynetToolbar>
扩展工具栏类:
public class PaynetToolbar extends Toolbar {
@Bind(R.id.titleField)
TextView titleField;
public PaynetToolbar(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
ButterKnife.bind(this);
titleField.setText("test");
}
}
我的目标是创建一个包含子项的扩展工具栏,此扩展工具栏将找到子项。
但我不知道如何更正创建扩展工具栏。
谢谢
答案 0 :(得分:1)
首先,我需要解决您寻找Android小部件的问题的想法:
这不是一个好主意,因为资源ID名称可以随时更新SDK或库更新,而不会发出任何警告。这意味着您的代码可能会停止工作。
但是,如果你需要这样做,那么有一些解决方案。 您可以使用Android设备监视器查找应用程序的膨胀视图的层次结构。它会显示资源ID(如果有的话),然后您可以使用findViewById进行硬编码以找到它。 ADM层次结构转储如下所示:
有时孩子可能没有id,那么你可以通过反射找到它或者通过Toolbar子项进行迭代并检查类型:
int count = toolbar.getChildCount();
for (int i = 0; i <= count; i++) {
View v = toolbar.getChildAt(i);
if (v instanceof TextView) {
// you found a TextView, you can do something to it
}
}
解决方案可能是上述每种技巧的组合,但仍然存在 - 对结构和资源ID进行硬编码存在风险。
答案 1 :(得分:0)
您已经在扩展工具栏,默认情况下,View工具栏的方法是findViewById。使用自定义工具栏中的构造函数将上下文和attrs传递给super,它就全部设置完毕。因此,您可以从自定义工具栏中调用它。
你需要检查FontTextView是否也是一个自定义视图,如果它有构造函数传递上下文和attrs on super。
public FontTextView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
在您的活动或片段中,您可以:
PaynetToolbar myToolbar = (PaynetToolbar) findViewById(R.id.toolbar);
titleField = (FontTextView) myToolbar.findViewById(R.id.titleField);