在XML

时间:2016-04-15 22:04:02

标签: java android xml

在我的应用我扩展 LinearLayoutRelativeLayout,所以每当我需要用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一样?

提前致谢!

3 个答案:

答案 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">