Java 如何在嵌套布局中显示自定义视图类?
我已经创建了一个自定义类,它从ViewJava 如何在嵌套布局中显示自定义视图类?,java,android,Java,Android,我已经创建了一个自定义类,它从View公共类MyView-extends-View扩展来绘制一个数学函数。我希望它在活动中使用两个/嵌套(不知道哪个术语更准确)布局绘制 我知道如何在简单的空活动中显示它: public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(sav
公共类MyView-extends-View
扩展来绘制一个数学函数。我希望它在活动中使用两个/嵌套(不知道哪个术语更准确)布局绘制
我知道如何在简单的空活动中显示它:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(myView(this)); //draws function on entire screen
}
}
但要在活动中显示哪个XML是这样的:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout>
<ConstraintLayout>
//draw my function here
</ConstraintLayout>
<ConstraintLayout>
</ConstraintLayout>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout>
<ConstraintLayout>
<com.example.MyView/>
</ConstraintLayout>
<ConstraintLayout>
</ConstraintLayout>
</LinearLayout>
//在这里画我的函数
我不知道:(或者我的方法全错了?请帮忙
至于Eixx的回答,我得到了错误:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.pwtafunc.marko.pwtafunc/com.pwtafunc.marko.pwtafunc.DrawFuncActivity}: android.view.InflateException: Binary XML file line #16: Binary XML file line #16: Error inflating class com.pwtafunc.marko.pwtafunc.Func
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
Caused by: android.view.InflateException: Binary XML file line #16: Binary XML file line #16: Error inflating class com.pwtafunc.marko.pwtafunc.Func
Caused by: android.view.InflateException: Binary XML file line #16: Error inflating class com.pwtafunc.marko.pwtafunc.Func
Caused by: java.lang.NoSuchMethodException: <init> [class android.content.Context, interface android.util.AttributeSet]
at java.lang.Class.getConstructor0(Class.java:2204)
at java.lang.Class.getConstructor(Class.java:1683)
at android.view.LayoutInflater.createView(LayoutInflater.java:618)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:787)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:727)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:858)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:821)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:861)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:821)
at android.view.LayoutInflater.inflate(LayoutInflater.java:518)
at android.view.LayoutInflater.inflate(LayoutInflater.java:426)
at android.view.LayoutInflater.inflate(LayoutInflater.java:377)
at android.support.v7.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:469)
at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:140)
at com.pwtafunc.marko.pwtafunc.DrawFuncActivity.onCreate(DrawFuncActivity.java:16)
at android.app.Activity.performCreate(Activity.java:6662)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
java.lang.RuntimeException:无法启动活动组件信息{com.pwtafunc.marko.pwtafunc/com.pwtafunc.marko.pwtafunc.DrawFuncActivity}:android.view.InflateException:二进制XML文件行#16:二进制XML文件行#16:膨胀类com.pwtafunc.marko.pwtafunc.DrawFuncActivity时出错
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)上
位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
位于android.app.ActivityThread.-wrap12(ActivityThread.java)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)上
位于android.os.Handler.dispatchMessage(Handler.java:102)
位于android.os.Looper.loop(Looper.java:154)
位于android.app.ActivityThread.main(ActivityThread.java:6077)
位于java.lang.reflect.Method.invoke(本机方法)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)上
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
原因:android.view.InflateException:二进制XML文件行#16:二进制XML文件行#16:对类com.pwtafunc.marko.pwtafunc.Func进行膨胀时出错
导致原因:android.view.InflateException:二进制XML文件行#16:膨胀类com.pwtafunc.marko.pwtafunc.Func时出错
原因:java.lang.NoSuchMethodException:[类android.content.Context,接口android.util.AttributeSet]
位于java.lang.Class.getConstructor0(Class.java:2204)
位于java.lang.Class.getConstructor(Class.java:1683)
在android.view.LayoutInflater.createView(LayoutInflater.java:618)
位于android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:787)
位于android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:727)
位于android.view.LayoutInflater.rInflate(LayoutInflater.java:858)
位于android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:821)
位于android.view.LayoutInflater.rInflate(LayoutInflater.java:861)
位于android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:821)
在android.view.LayoutInflater.inflate(LayoutInflater.java:518)
在android.view.LayoutInflater.充气(LayoutInflater.java:426)
在android.view.LayoutInflater.inflate(LayoutInflater.java:377)
位于android.support.v7.app.AppCompateDelegateImpl.setContentView(AppCompateDelegateImpl.java:469)
位于android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:140)
在com.pwtafnc.marko.pwtafnc.DrawFuncActivity.onCreate(DrawFuncActivity.java:16)上
位于android.app.Activity.performCreate(Activity.java:6662)
位于android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599)上
位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
位于android.app.ActivityThread.-wrap12(ActivityThread.java)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)上
位于android.os.Handler.dispatchMessage(Handler.java:102)
位于android.os.Looper.loop(Looper.java:154)
位于android.app.ActivityThread.main(ActivityThread.java:6077)
位于java.lang.reflect.Method.invoke(本机方法)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)上
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
至于Kling Klang写了什么,对不起,我的错误是NullPointerException
,但是当我处理函数时,整个屏幕上都画了这个函数:(
而且Marcin Grabowski解决方案是正确的,非常感谢。您可以将其插入XML,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout>
<ConstraintLayout>
//draw my function here
</ConstraintLayout>
<ConstraintLayout>
</ConstraintLayout>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout>
<ConstraintLayout>
<com.example.MyView/>
</ConstraintLayout>
<ConstraintLayout>
</ConstraintLayout>
</LinearLayout>
加上Eixx的答案
要允许视图直接在XML布局文件中使用,您至少需要实现构造函数
public MyView(Context context, AttributeSet attrs)
您也可以从代码中添加它
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ConstraintLayout constraintLayout = findViewById(R.id.your_constraint_layout_id);
constraintLayout.addView(myView(this));
}
}
正常使用它。它是否嵌套实际上并不重要。为什么要投反对票?如果我像这样做
setContentView(myView(this));
在嵌套布局的活动中,应用程序不断崩溃:(发布完整的日志。我们打赌你有一个NullPointerException?