创建在 xml 属性中接受其他布局的自定义视图
Creating Custom Views that accept other layouts in xml attributes
我这里有一个 open question 我正在尝试解决,我可能已经找到了一个可能的解决方案 error-prone;但是,我不知道如何编写解决方案。
该解决方案与 android.support.design.widget.NavigationView
处理 XML 中的 header 视图的方式非常相似!唯一的问题是我试图搜索 NavigationView
的源代码,但我似乎找不到它。我可以轻松找到其他 Android 源代码 - 除了较新的设计库。
如果我能从 Google 找到源代码,那么我可以实现类似的东西。
代码
<android.support.design.widget.NavigationView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:menu="@menu/drawer"
app:headerLayout="@layout/drawer_header" />
看到最后一行了吗?我希望能够为我自己的 customView 做类似的事情,以便在其中插入另一个视图。
所以我的问题是:
Design Library 的 NavigationView 的源代码在哪里?
或
是否有另一个自定义视图允许您在其中插入布局,代码已在线发布?
或
如果网上什么都没有,那么一个人会怎么做呢?有可能的。 NavigationView 做到了。
这是您可以如何操作的示例:
在你的 resources.xml
:
<declare-styleable name="MyCustomView">
<attr name="child_view" format="reference" />
</declare-styleable>
在你的MyCustomView.java
中:
public class MyCustomView extends ViewGroup {
public MyCustomView(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.MyCustomView, 0, 0);
int childView = a.getResourceId(R.styleable.MyCustomView_child_view, R.layout.default_child_view);
a.recycle();
LayoutInflater.from(context).inflate(childView, this, true);
}
}
在您的布局文件中:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:custom_view="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<your.package.MyCustomView
android:layout_width="match_parent"
android:layout_height="wrap_content"
custom_view:child_view="@layout/some_layout" />
</LinearLayout>
我这里有一个 open question 我正在尝试解决,我可能已经找到了一个可能的解决方案 error-prone;但是,我不知道如何编写解决方案。
该解决方案与 android.support.design.widget.NavigationView
处理 XML 中的 header 视图的方式非常相似!唯一的问题是我试图搜索 NavigationView
的源代码,但我似乎找不到它。我可以轻松找到其他 Android 源代码 - 除了较新的设计库。
如果我能从 Google 找到源代码,那么我可以实现类似的东西。
代码
<android.support.design.widget.NavigationView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:menu="@menu/drawer"
app:headerLayout="@layout/drawer_header" />
看到最后一行了吗?我希望能够为我自己的 customView 做类似的事情,以便在其中插入另一个视图。
所以我的问题是:
Design Library 的 NavigationView 的源代码在哪里?
或
是否有另一个自定义视图允许您在其中插入布局,代码已在线发布?
或
如果网上什么都没有,那么一个人会怎么做呢?有可能的。 NavigationView 做到了。
这是您可以如何操作的示例:
在你的 resources.xml
:
<declare-styleable name="MyCustomView">
<attr name="child_view" format="reference" />
</declare-styleable>
在你的MyCustomView.java
中:
public class MyCustomView extends ViewGroup {
public MyCustomView(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.MyCustomView, 0, 0);
int childView = a.getResourceId(R.styleable.MyCustomView_child_view, R.layout.default_child_view);
a.recycle();
LayoutInflater.from(context).inflate(childView, this, true);
}
}
在您的布局文件中:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:custom_view="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<your.package.MyCustomView
android:layout_width="match_parent"
android:layout_height="wrap_content"
custom_view:child_view="@layout/some_layout" />
</LinearLayout>