如何从其他视图创建自己的XML布局视图

时间:2016-12-25 13:37:35

标签: android android-layout

我有一个RelativeLayout TextView(第一个标签),EditText(输入),TextView(第二个标签)。我在项目中至少有10个活动。我如何提取视图并制作自己的视图。所以,如果我想更改 textSize ,我将只在一个地方更改它,而不是10个。

例如我想要这个

<RelativeLayout
  android:width="match_parent"
  android:height="wrap_content"
>
  <TextView
    android:id="firstTextView"
    ...
    android:text="I like">
  <EditText
     android:id="edittextColor" 
     hint="type some color here"
     ... >
<TextView
    android:id="secondTextView"
    ...
    android:text="car.">
    </RelativeLayout>

所以,我在很多地方都需要这样的东西。我想拥有的是:

<MySpecialView
   firstText="I like"
   colorEditTextHint="type color here"
   secondText="car"/>

4 个答案:

答案 0 :(得分:1)

<强> Inflaters

假设您的 RelativeLayout 文件名为reusable_layout。这意味着您可以R.layout.reusable_layout访问它(考虑到您将此文件存储在项目的layouts文件夹中)。

在您通常的 onCreate() 覆盖中,在开头添加这些变量:LayoutInflater inflater = getSystemService(LAYOUT_INFLATER_SERVICE); RelativeLayout layout = inflater.inflate(R.layout.reusable_layout, null);

之后,请致电setContentView(layout);

如果您想要修改孩子,可以拨打layout.getChildAt(int childNumber);这会返回 View

编辑第一个TextView子项的示例:

TextView tv = (TextView) layout.getChildAt(0);
tv.setText("Example String");

<强>更新 另一种做你想做的事情!

创建自定义视图可以完成这项工作!

这里包含了一个很好的教程:https://developer.android.com/training/custom-views/create-view.html#subclassview

我认为您需要了解的所有信息都包括在内。 这里还包括另一个可能有用的来源:how to add views inside a custom View?

希望我帮助,

<强> -Daniel

答案 1 :(得分:0)

您可以创建一个公共布局,并包含在所有10个活动布局中,如此

<强> common_layout.xml

 <?xml version="1.0" encoding="utf-8"?>
 <RelativeLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="vertical" android:layout_width="match_parent"
   android:layout_height="match_parent">


  <TextView
    android:id="@+id/label1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Label1"/>

  <EditText
    android:id="@+id/input1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@id/label1"
    android:text="Input1"/>

 </RelativeLayout>

<强> activity_layout

     <?xml version="1.0" encoding="utf-8"?>
     <LinearLayout 
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:orientation="vertical"  
      android:layout_width="match_parent"
      android:layout_height="match_parent">

        <include layout="@layout/common_layout"/>

        <TextView
          android:id="@+id/textinactivity_tv"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:text="Activity text"/>

    </LinearLayout>

我希望这就是你想要的。

答案 2 :(得分:0)

  

虽然Android提供了各种小部件来提供小型和   可重复使用的交互元素,您可能还需要重复使用更大的   需要特殊布局的组件。有效地重复使用   完整的布局,您可以使用包含合并标记   在当前布局中嵌入另一个布局。   https://developer.android.com/training/improving-layouts/reusing-layouts.html

<include>怎么样 在您要添加的地方的任何其他xml中为您创建your_base_layout.xml<include>

your_base_layout.xml

<LinearLayout
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:id="@+id/some_other_id">
   <Button
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:id="@+id/button1" />
 </LinearLayout>
<include
   android:id="@+id/include_id"
   layout="@layout/your_base_layout" />

用法示例:another_layout.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/app_bg"
    android:gravity="center_horizontal">

      <include
         android:id="@+id/include_id"
         layout="@layout/your_base_layout" />

    <TextView android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:text="@string/hello"
              android:padding="10dp" />

    ...

</LinearLayout>

这是您访问其中的视图的方式,

View includedLayout = findViewById(R.id.some_id_if_needed);
Button buttonInsideTheIncludedLayout = (Button) includedLayout.findViewById(R.id.button1); // if there is a button in your base layout that you included access like this

找到很棒的答案&gt; here

答案 3 :(得分:0)

您可以使用指定的属性定义自己的控件。

将ButtonPlus.java保存到您的包中。

e.g。

public class ButtonPlus extends Button {

    public ButtonPlus(Context context) {
        super(context);
    }

    public ButtonPlus(Context context, AttributeSet attrs) {
        super(context, attrs);
        CustomFontHelper.setCustomFont(this, context, attrs);
    }

    public ButtonPlus(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        CustomFontHelper.setCustomFont(this, context, attrs);
    }
}

您可以在布局XML文件中使用。