在我的应用我扩展 LinearLayout
和RelativeLayout
,所以每当我需要用XML声明布局时(你可能经常知道它)我需要写一个长标记,以便指向视图的包。
因此XML文件如下所示:
<com.company.material.widget.LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.company.material.widget.RelativeLayout
android:layout_width="match_parent"
android:layout_height="@dimen/titlebar_height"
android:background="@color/primary"
android:orientation="horizontal">
<TextView
style="@style/Text.Field.Small"
android:id="@+id/form_title"
android:layout_width="wrap_content"
android:layout_height="match_parent"/>
<Button
style="@style/Button.Main"
android:id="@+id/form_submit"
android:layout_width="wrap_content"
android:layout_height="match_parent"/>
</com.company.material.widget.RelativeLayout>
<com.company.essentials.view.FormView
android:id="@+id/formview"
android:layout_width="match_parent"
android:layout_height="match_parent">
...
这很乱!
有没有办法缩写这个?与AppLinearLayout
而不是com.company.material.widget.LinearLayout
一样?
提前致谢!
答案 0 :(得分:1)
如果它对你有价值,你可以自定义你的活动布局。
public class MyActivity extends Activity implements LayoutInflater.Factory {
@Override public void onCreate(Bundle _icicle) {
super.onCreate(_icicle);
setContentView(R.layout.my_activity);
}
@Override public Object getSystemService(String _name) {
Object service = super.getSystemService(_name);
if(LAYOUT_INFLATER_SERVICE.equals(_name)) {
LayoutInflater myInflater = ((LayoutInflater)service).cloneInContext(this);
myInflater.setFactory(this);
return myInflater;
}
return service;
}
@Override public View onCreateView (String _tag, Context _ctx, AttributeSet _as) {
if("mytag".equals(_tag))
return new MyLinearLayout(_ctx, _as);
else
return null;
}
}
setContentView
将调用getSystemService
以获取布局inflater,并且对于每个标记,布局inflater将查询其每个工厂(包括我们的自定义工厂)以查看工厂是否知道如何创建与该标签对应的对象。
答案 1 :(得分:1)
您可以将View类移动到android.view
包。这样您就可以只编写<AppRelativeLayout />
而不是<com.company.material.widget.AppRelativeLayout />
,因为没有包前缀的View标记名称会自动完成android.view
包。
如果您不想将整个班级移到此包中,您可以创建一个虚拟子类àla:
package android.view;
public class AppRelativeLayout extends com.company.material.widget.RelativeLayout {
// same constructors as super class
public AppRelativeLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
}
您必须确保不使用与Android框架相同的类名,例如RelativeLayout
,因为这会与现有的视图和布局名称冲突。这就是为什么我将上面的例子命名为AppRelativeLayout
。
答案 2 :(得分:0)
如果您愿意,也可以选择其他选项
<view
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.company.material.widget.LinearLayout"
android:orientation="vertical">