Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 创建自己的FrameLayout类不需要';行不通_Java_Android_Android Layout - Fatal编程技术网

Java 创建自己的FrameLayout类不需要';行不通

Java 创建自己的FrameLayout类不需要';行不通,java,android,android-layout,Java,Android,Android Layout,我想创建一个自己的FrameLayout类,我可以在其中取消toch事件,但每次应用程序都会直接崩溃并显示错误消息 我用普通的FrameLayout运行了相同的代码,没有崩溃。因此,应用程序崩溃不是因为其他原因 FrameLayout类: package com.example.motivationsappbetter; 导入android.content.Context; 导入android.support.annotation.NonNull; 导入android.view.MotionEv

我想创建一个自己的FrameLayout类,我可以在其中取消toch事件,但每次应用程序都会直接崩溃并显示错误消息

我用普通的FrameLayout运行了相同的代码,没有崩溃。因此,应用程序崩溃不是因为其他原因

FrameLayout类:

package com.example.motivationsappbetter;
导入android.content.Context;
导入android.support.annotation.NonNull;
导入android.view.MotionEvent;
导入android.widget.FrameLayout;
公共类MainFrameLayout扩展了FrameLayout{
私有布尔canTouch=true;
公共MainFrameLayout(@NonNull上下文){
超级(上下文);
}
@凌驾
公共布尔值onInterceptTouchEvent(MotionEvent ev){
如果(坎图奇)
返回超级onInterceptTouchEvent(ev);
其他的
返回true;
}
公共void setCanTouch(布尔b){
canTouch=b;
}
}
主要活动:

public类MainActivity扩展了AppCompatActivity{
主机布局;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
大型机=findViewById(R.id.main_框架);
mainFrame.get前台().setAlpha(0);
}
}
activity_main.xml文件:


这是错误消息:

2019-10-07 16:20:11.624 25601-25601/com.example.motivationsappbetter E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.motivationsappbetter, PID: 25601
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.motivationsappbetter/com.example.motivationsappbetter.MainActivity}: android.view.InflateException: Binary XML file line #11: Binary XML file line #11: Error inflating class com.example.motivationsappbetter.MainFrameLayout
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2793)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2864)
        at android.app.ActivityThread.-wrap12(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1567)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:156)
        at android.app.ActivityThread.main(ActivityThread.java:6523)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)
     Caused by: android.view.InflateException: Binary XML file line #11: Binary XML file line #11: Error inflating class com.example.motivationsappbetter.MainFrameLayout
     Caused by: android.view.InflateException: Binary XML file line #11: Error inflating class com.example.motivationsappbetter.MainFrameLayout
     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:625)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:798)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:738)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:869)
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:832)
        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.example.motivationsappbetter.MainActivity.onCreate(MainActivity.java:59)
        at android.app.Activity.performCreate(Activity.java:6915)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2746)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2864)
        at android.app.ActivityThread.-wrap12(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1567)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:156)
        at android.app.ActivityThread.main(ActivityThread.java:6523)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)
2019-10-07 16:20:11.624 25601-25601/com.example.motivationsappbetter E/AndroidRuntime:致命异常:main
流程:com.example.motivationsappbetter,PID:25601
java.lang.RuntimeException:无法启动活动组件信息{com.example.motivationsappbetter/com.example.motivationsappbetter.MainActivity}:android.view.InflateException:二进制XML文件行#11:二进制XML文件行#11:膨胀类com.example.motivationsappbetter.MainFrameLayout时出错
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2793)上
位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2864)
位于android.app.ActivityThread.-wrap12(ActivityThread.java)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1567)
位于android.os.Handler.dispatchMessage(Handler.java:105)
位于android.os.Looper.loop(Looper.java:156)
位于android.app.ActivityThread.main(ActivityThread.java:6523)
位于java.lang.reflect.Method.invoke(本机方法)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942)上
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)
原因:android.view.InflateException:二进制XML文件行#11:二进制XML文件行#11:膨胀类com.example.motivationsappbetter.MainFrameLayout时出错
原因:android.view.InflateException:二进制XML文件行#11:错误膨胀类com.example.motivationsappbetter.MainFrameLayout
原因: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:625)
位于android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:798)
位于android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:738)
位于android.view.LayoutInflater.rInflate(LayoutInflater.java:869)
位于android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:832)
在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.example.motivationsappbetter.MainActivity.onCreate(MainActivity.java:59)
位于android.app.Activity.performCreate(Activity.java:6915)
位于android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2746)上
位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2864)
位于android.app.ActivityThread.-wrap12(ActivityThread.java)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1567)
位于android.os.Handler.dispatchMessage(Handler.java:105)
位于android.os.Looper.loop(Looper.java:156)
位于android.app.ActivityThread.main(ActivityThread.java:6523)
位于java.lang.reflect.Method.invoke(本机方法)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942)上
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)
我很乐意得到有用的答案:p


PS:很抱歉我的英语不好

例外情况会在“原因”中给你答案。它表示对于采用
上下文
属性集
的构造函数,找不到该方法

原因:java.lang.NoSuchMethodException:[类android.content.Context,接口android.util.AttributeSet]

Android对不同的版本使用不同的构造函数-在创建自定义视图类时,您需要包括对所有这些类的覆盖:

public FrameLayout(@NonNull Context context) {...}

public FrameLayout(@NonNull Context context, @Nullable AttributeSet attrs) {...}

public FrameLayout(@NonNull Context context, @Nullable AttributeSet attrs,
        @AttrRes int defStyleAttr) {...}

public FrameLayout(@NonNull Context context, @Nullable AttributeSet attrs,
        @AttrRes int defStyleAttr, @StyleRes int defStyleRes) {...}
这样,您的代码将在所有版本的Android上运行,并为该版本选择正确的构造函数



请参阅显示在

中给定的所有必需方法的已完成类。自定义视图必须至少具有一个必需的公共构造函数,该构造函数在上下文中采用AttributeSet参数:

public class MainFrameLayout extends FrameLayout {
    private boolean canTouch = true;

    public MainFrameLayout(@NonNull Context context) {
        super(context);
    }

    public MainFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public MainFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public MainFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        if (canTouch)
            return super.onInterceptTouchEvent(ev);
        else
            return true;
    }


    public void setCanTouch(boolean b) {
        canTouch = b;
    }
}

当然,我很高兴MohammadReza能在这之前为你发布一个更完整的答案