Android系统。在自定义工具栏中按ID查找子项

时间:2016-01-18 12:44:18

标签: android

我有子项的工具栏布局:

<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");
    }
}

我的目标是创建一个包含子项的扩展工具栏,此扩展工具栏将找到子项。

但我不知道如何更正创建扩展工具栏。

谢谢

2 个答案:

答案 0 :(得分:1)

首先,我需要解决您寻找Android小部件的问题的想法:

  

这不是一个好主意,因为资源ID名称可以随时更新SDK或库更新,而不会发出任何警告。这意味着您的代码可能会停止工作。

但是,如果你需要这样做,那么有一些解决方案。 您可以使用Android设备监视器查找应用程序的膨胀视图的层次结构。它会显示资源ID(如果有的话),然后您可以使用findViewById进行硬编码以找到它。 ADM层次结构转储如下所示:

enter image description here

有时孩子可能没有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);