自定义视图扩展相对布局

Posted

技术标签:

【中文标题】自定义视图扩展相对布局【英文标题】:Custom View Extending Relative Layout 【发布时间】:2014-04-01 07:29:32 【问题描述】:
package com.binod.customviewtest;

import android.content.Context;
import android.view.LayoutInflater;
import android.widget.RelativeLayout;

public class CustomView extends RelativeLayout

    public CustomView(Context context) 
        super(context);
        // TODO Auto-generated constructor stub

//      LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        LayoutInflater mInflater = LayoutInflater.from(context);
        mInflater.inflate(R.layout.custom_view  , this, true);
    


包括为

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    tools:context=".MainActivity" >

    <com.binod.customviewtest.CustomView 
        android:layout_
        android:layout_
        ></com.binod.customviewtest.CustomView>

</RelativeLayout>

自定义视图为

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    >

    <TextView
        android:layout_
        android:layout_
        android:text="@string/hello_world" />

</RelativeLayout>

刚开始添加一个新的自定义视图并得到了一次错误如果我清除它然后可以继续前进

我遇到崩溃“原因:android.view.InflateException: Binary XML file line #1: Error inflating class”

【问题讨论】:

您是否还有其他构造函数,并发布自定义视图的包名称和您拥有自定义视图的 xml 提供custom_view.xml文件 @RomanBlack 自定义视图添加到帖子中 @Raghunandan 目前不只有一个构造函数 @binod 现在查看我的帖子。应该修复它 【参考方案1】:

您还需要有 2 个构造函数。想知道为什么

Do I need all three constructors for an Android custom view?

public class CustomView extends RelativeLayout

    LayoutInflater mInflater;
    public CustomView(Context context) 
        super(context);
         mInflater = LayoutInflater.from(context);
         init(); 

    
    public CustomView(Context context, AttributeSet attrs, int defStyle)
    
    super(context, attrs, defStyle);
    mInflater = LayoutInflater.from(context);
    init(); 
    
    public CustomView(Context context, AttributeSet attrs) 
    super(context, attrs);
    mInflater = LayoutInflater.from(context);
    init(); 
    
   public void init()
   
       View v = mInflater.inflate(R.layout.custom_view, this, true);
       TextView tv = (TextView) v.findViewById(R.id.textView1);
   tv.setText(" Custom RelativeLayout");
   

我正在发布一个示例。我的包名不同

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_ >
<com.example.testall.CustomView
        android:id="@+id/timer1"
        android:layout_
        android:layout_
        />
</RelativeLayout>

custom_view.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_ >

    <TextView
        android:id="@+id/textView1"
        android:layout_
        android:layout_
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="60dp"
        android:text="My Custom View" />

</RelativeLayout>

MainActivity.java

public class MainActivity extends Activity 

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        

捕捉

正如pskink 在activity_main.xml 的RelativeLayout 中建议的那样,带有一个子CustomView。然后CustomView 扩展RealtiveLayout,然后你再次用RelativeLayout 和子TextView 膨胀customview。不需要所有这些。只是一个自定义视图。以编程方式创建一个 TextView,然后将 textview 添加到 RelativeLayout

编辑:

activity_main.xml

<com.example.testall.CustomView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/timer1"
    android:layout_
    android:layout_
    />

自定义视图

public class CustomView extends RelativeLayout

    TextView tv;
    public CustomView(Context context) 
        super(context);
         tv = new TextView(context);
         init(); 

    
    public CustomView(Context context, AttributeSet attrs, int defStyle)
    
    super(context, attrs, defStyle);
    tv = new TextView(context);
    init(); 
    
    public CustomView(Context context, AttributeSet attrs) 
    super(context, attrs);
    tv = new TextView(context);
    init(); 
    
   public void init()
   
       this.addView(tv);
       tv.setText(" Custom RelativeLayout");
   

【讨论】:

@Raghunandan 而不是一个 RelativeLayout 你最终会得到 三个 RelativeLayouts @pskink 已编辑,但我想指出构造函数。任何关于相对布局的正确方式都是不必要的。 @binod 检查编辑。无需 3 相对布局,您甚至可以对齐 textview 并将属性设置为相同 可以更新代码的第一个 sn-p。不要调用 super,而是调用 this(),直到调用最终的构造函数。放大那里的视图。 “v”永远不会在您的 sn-p 中创建,尽管很明显它会由您不必要地引用的充气机返回。不再需要“init”并持有不需要的引用。 @BajaBob 是的,你可以这样做。我错过了第一个,是的,第二个自定义视图也可以改进【参考方案2】:

尝试获取Activity并使用它

 
    LayoutInflater inflter = activity.getLayoutInflater();
    View v = inflter.inflate(R.layout.custom_view,null);
    this.addView(v); or addView(v);
    

【讨论】:

我认为这不是问题所在。我猜活动上下文被传递给构造函数 活动也不起作用。我将其包含在 xml 中作为 @binod 请发布更多信息。您拥有 customview 的 xml 和 customview 的包名,您拥有的任何其他 custructors。您提供很少的信息来解决您的问题 @binod 编辑并发布完整的代码评论不是添加代码(包括包名)的地方 @Raghunandan 帖子已编辑。如果还需要什么,请告诉我

以上是关于自定义视图扩展相对布局的主要内容,如果未能解决你的问题,请参考以下文章

自定义 Android 视图在线性和相对布局中显示不同

自定义视图中相对布局内的文本视图未正确应用重力?

自定义布局上的Onlayout方法扩展LinearLayout

Android:如何根据大小创建自定义布局

tools:listitem 用于扩展 RecyclerView 的自定义视图

什么方法可以捕获在自定义视图(布局)中选择的上下文菜单项?