自定义视图扩展相对布局
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 中作为以上是关于自定义视图扩展相对布局的主要内容,如果未能解决你的问题,请参考以下文章
自定义布局上的Onlayout方法扩展LinearLayout