从库中扩充我的自定义 TextView 时出错
Error inflating my Custom TextView from Library
我有从我的自定义库加载的 customTextView。但它无法在 main_layout 内膨胀,我的应用程序停止工作。我发现如果我将 MyTextView 放在主项目中它工作正常,问题是从 myLib 加载。
public class MyTextView extends TextView {
public MyTextView(Context context){
super(context);
}
public MyTextView(Context context, AttributeSet attrs) {
super(context, attrs);
initAttr(attrs);
}
public MyTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initAttr(attrs);
}
private void initAttr(AttributeSet attrs) {
TypedArray a=getContext().obtainStyledAttributes(
attrs,
R.styleable.myView);
super.setText("blablabla");
a.recycle();
}
我在 xml 设计中收到此警告:无法在我的自定义 class 上找到以下 classes,尽管class 完全加载自动!所以我认为图书馆有些问题。我在 android studio 通过
项目结构/新模块/android库
我是这样称呼它的:
<com.kenji.mylib.MyTextView
android:layout_width="50dp"
android:layout_height="50dp"/>
这是错误:
04-29 14:22:35.645 19805-19805/com.kenji.myapplication E/AndroidRuntime? FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.kenji.myapplication/com.kenji.myapplication.MainActivity}: android.view.InflateException: Binary XML file line #13: Error inflating class com.kenji.mylib.myTextView.myTextView
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1659)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1675)
at android.app.ActivityThread.access00(ActivityThread.java:121)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:943)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3701)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:624)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.view.InflateException: Binary XML file line #13: Error inflating class com.kenji.mylib.myTextView.myTextView
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:581)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:623)
at android.view.LayoutInflater.inflate(LayoutInflater.java:408)
at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
at android.support.v7.app.ActionBarActivityDelegateBase.setContentView(ActionBarActivityDelegateBase.java:240)
我只是删除排除的可能错误...
编辑
下一个可能的错误,您的 TypedArray:
TypedArray a=getContext().obtainStyledAttributes(
attrs,
R.styleable.myView);
但是你的样式叫做 MyAttrs
,所以它应该是:
TypedArray a=getContext().obtainStyledAttributes(
attrs,
R.styleable.MyAttrs);
但是你必须获得你的属性,像这样:
public MyTextView(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a=context.obtainStyledAttributes(
attrs,
R.styleable.MyAttrs);
}
public MyTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
TypedArray a=context.obtainStyledAttributes(
attrs,
R.styleable.MyAttrs);
}
public class MyTextView extends TextView
{
public MyTextView(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
init();
}
public MyTextView(Context context, AttributeSet attrs)
{
super(context, attrs);
init();
}
public MyTextView(Context context)
{
super(context);
init();
}
private void init()
{
setText("blablabla");
}
}
并且在您的布局中
<yourpackage.MyTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
确保您必须在 build.gradle 文件
中定义必要的 resources/assets
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
就我而言,我缺少资产声明
因为app和library的包名不一致。你必须改变其中之一。
我有从我的自定义库加载的 customTextView。但它无法在 main_layout 内膨胀,我的应用程序停止工作。我发现如果我将 MyTextView 放在主项目中它工作正常,问题是从 myLib 加载。
public class MyTextView extends TextView {
public MyTextView(Context context){
super(context);
}
public MyTextView(Context context, AttributeSet attrs) {
super(context, attrs);
initAttr(attrs);
}
public MyTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initAttr(attrs);
}
private void initAttr(AttributeSet attrs) {
TypedArray a=getContext().obtainStyledAttributes(
attrs,
R.styleable.myView);
super.setText("blablabla");
a.recycle();
}
我在 xml 设计中收到此警告:无法在我的自定义 class 上找到以下 classes,尽管class 完全加载自动!所以我认为图书馆有些问题。我在 android studio 通过 项目结构/新模块/android库
我是这样称呼它的:
<com.kenji.mylib.MyTextView
android:layout_width="50dp"
android:layout_height="50dp"/>
这是错误:
04-29 14:22:35.645 19805-19805/com.kenji.myapplication E/AndroidRuntime? FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.kenji.myapplication/com.kenji.myapplication.MainActivity}: android.view.InflateException: Binary XML file line #13: Error inflating class com.kenji.mylib.myTextView.myTextView
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1659)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1675)
at android.app.ActivityThread.access00(ActivityThread.java:121)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:943)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3701)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:624)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.view.InflateException: Binary XML file line #13: Error inflating class com.kenji.mylib.myTextView.myTextView
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:581)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:623)
at android.view.LayoutInflater.inflate(LayoutInflater.java:408)
at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
at android.support.v7.app.ActionBarActivityDelegateBase.setContentView(ActionBarActivityDelegateBase.java:240)
我只是删除排除的可能错误...
编辑
下一个可能的错误,您的 TypedArray:
TypedArray a=getContext().obtainStyledAttributes(
attrs,
R.styleable.myView);
但是你的样式叫做 MyAttrs
,所以它应该是:
TypedArray a=getContext().obtainStyledAttributes(
attrs,
R.styleable.MyAttrs);
但是你必须获得你的属性,像这样:
public MyTextView(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a=context.obtainStyledAttributes(
attrs,
R.styleable.MyAttrs);
}
public MyTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
TypedArray a=context.obtainStyledAttributes(
attrs,
R.styleable.MyAttrs);
}
public class MyTextView extends TextView
{
public MyTextView(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
init();
}
public MyTextView(Context context, AttributeSet attrs)
{
super(context, attrs);
init();
}
public MyTextView(Context context)
{
super(context);
init();
}
private void init()
{
setText("blablabla");
}
}
并且在您的布局中
<yourpackage.MyTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
确保您必须在 build.gradle 文件
中定义必要的 resources/assets sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
就我而言,我缺少资产声明
因为app和library的包名不一致。你必须改变其中之一。