CustomView不起作用

时间:2017-08-07 11:33:04

标签: android

我正在尝试使用代表多米诺骨牌的自定义View类,遵循this回答的解决方案。没有错误,应用程序运行但没有任何显示。由于它与链接中引用的问题非常相似,我想这只是一个小问题,但我没有在代码中找到错误。

Domino.java:

package com.example.android.dominoneu;

import android.content.Context;
import android.widget.LinearLayout;


public class Domino extends LinearLayout {

    public Domino(Context context){

        super(context);
    }
}

domino.xml:

<?xml version="1.0" encoding="utf-8"?>
<com.example.android.dominoneu.Domino xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:Domino="http://schemas.android.com/apk/res-auto"
    android:orientation="horizontal" android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="LEFT"
        android:textColor="#000000"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="RIGHT"
        android:textColor="#000000"/>

</com.example.android.dominoneu.Domino>

在MainActivity中,它已添加:

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;

public class MainActivity extends AppCompatActivity {

    private RelativeLayout board;

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

        board = (RelativeLayout) findViewById(R.id.board);
        board.addView(new Domino(this));

    }
}

4 个答案:

答案 0 :(得分:1)

Aug 10, 2017 3:15:25 PM org.apache.catalina.core.AprLifecycleListener init WARNING: The APR based Apache Tomcat Native library failed to load. The error reported was [C:\apache-tomcat-8.5.4\bin\tcnative-1.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform] java.lang.UnsatisfiedLinkError: C:\apache-tomcat-8.5.4\bin\tcnative-1.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform at java.lang.ClassLoader$NativeLibrary.load(Native Method) at java.lang.ClassLoader.loadLibrary0(Unknown Source) at java.lang.ClassLoader.loadLibrary(Unknown Source) at java.lang.Runtime.loadLibrary0(Unknown Source) at java.lang.System.loadLibrary(Unknown Source) at org.apache.tomcat.jni.Library.<init>(Library.java:42) at org.apache.tomcat.jni.Library.initialize(Library.java:178) at org.apache.catalina.core.AprLifecycleListener.init(AprLifecycleListener.java:198) at org.apache.catalina.core.AprLifecycleListener.isAprAvailable(AprLifecycleListener.java:107) at org.apache.catalina.connector.Connector.setProtocol(Connector.java:587) at org.apache.catalina.connector.Connector.<init>(Connector.java:70) at org.apache.catalina.startup.ConnectorCreateRule.begin(ConnectorCreateRule.java:64) at org.apache.tomcat.util.digester.Digester.startElement(Digester.java:1188) at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(Unknown Source) at com.sun.org.apache.xerces.internal.parsers.AbstractXMLDocumentParser.emptyElement(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source) at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source) at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source) at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source) at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1461) at org.apache.catalina.startup.Catalina.load(Catalina.java:578) at org.apache.catalina.startup.Catalina.load(Catalina.java:629) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:311) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:494) Aug 10, 2017 3:15:29 PM org.apache.tomcat.util.digester.SetPropertiesRule begin WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:MVC_HelloWorld' did not find a matching property. Aug 10, 2017 3:15:29 PM org.apache.catalina.startup.VersionLoggerListener log INFO: Server version: Apache Tomcat/8.5.4 Aug 10, 2017 3:15:29 PM org.apache.catalina.startup.VersionLoggerListener log INFO: Server built: Jul 6 2016 08:43:30 UTC Aug 10, 2017 3:15:29 PM org.apache.catalina.startup.VersionLoggerListener log INFO: Server number: 8.5.4.0 Aug 10, 2017 3:15:29 PM org.apache.catalina.startup.VersionLoggerListener log INFO: OS Name: Windows 10 Aug 10, 2017 3:15:29 PM org.apache.catalina.startup.VersionLoggerListener log INFO: OS Version: 10.0 Aug 10, 2017 3:15:29 PM org.apache.catalina.startup.VersionLoggerListener log INFO: Architecture: amd64 Aug 10, 2017 3:15:29 PM org.apache.catalina.startup.VersionLoggerListener log INFO: Java Home: C:\Program Files\Java\jre1.8.0_144 Aug 10, 2017 3:15:29 PM org.apache.catalina.startup.VersionLoggerListener log INFO: JVM Version: 1.8.0_144-b01 Aug 10, 2017 3:15:29 PM org.apache.catalina.startup.VersionLoggerListener log INFO: JVM Vendor: Oracle Corporation Aug 10, 2017 3:15:29 PM org.apache.catalina.startup.VersionLoggerListener log INFO: CATALINA_BASE: C:\apache-tomcat-8.5.4 Aug 10, 2017 3:15:29 PM org.apache.catalina.startup.VersionLoggerListener log INFO: CATALINA_HOME: C:\apache-tomcat-8.5.4 Aug 10, 2017 3:15:29 PM org.apache.catalina.startup.VersionLoggerListener log INFO: Command line argument: -Dcatalina.base=C:\apache-tomcat-8.5.4 Aug 10, 2017 3:15:29 PM org.apache.catalina.startup.VersionLoggerListener log INFO: Command line argument: -Dcatalina.home=C:\apache-tomcat-8.5.4 Aug 10, 2017 3:15:29 PM org.apache.catalina.startup.VersionLoggerListener log INFO: Command line argument: -Dwtp.deploy=C:\apache-tomcat-8.5.4\wtpwebapps Aug 10, 2017 3:15:29 PM org.apache.catalina.startup.VersionLoggerListener log INFO: Command line argument: -Djava.endorsed.dirs=C:\apache-tomcat-8.5.4\endorsed Aug 10, 2017 3:15:29 PM org.apache.catalina.startup.VersionLoggerListener log INFO: Command line argument: -Dfile.encoding=Cp1252 Aug 10, 2017 3:15:35 PM org.apache.coyote.AbstractProtocol init INFO: Initializing ProtocolHandler ["http-nio-8082"] Aug 10, 2017 3:15:37 PM org.apache.tomcat.util.net.NioSelectorPool getSharedSelector INFO: Using a shared selector for servlet write/read Aug 10, 2017 3:15:37 PM org.apache.coyote.AbstractProtocol init INFO: Initializing ProtocolHandler ["ajp-nio-8009"] Aug 10, 2017 3:15:37 PM org.apache.tomcat.util.net.NioSelectorPool getSharedSelector INFO: Using a shared selector for servlet write/read Aug 10, 2017 3:15:37 PM org.apache.catalina.startup.Catalina load INFO: Initialization processed in 19471 ms Aug 10, 2017 3:15:38 PM org.apache.catalina.core.StandardService startInternal INFO: Starting service Catalina Aug 10, 2017 3:15:38 PM org.apache.catalina.core.StandardEngine startInternal INFO: Starting Servlet Engine: Apache Tomcat/8.5.4 Aug 10, 2017 3:15:42 PM org.apache.catalina.core.ContainerBase startInternal SEVERE: A child container failed during start java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/MVC_HelloWorld]] at java.util.concurrent.FutureTask.report(Unknown Source) at java.util.concurrent.FutureTask.get(Unknown Source) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:911) at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:890) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:152) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1403) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1393) at java.util.concurrent.FutureTask.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/MVC_HelloWorld]] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:158) ... 6 more Caused by: java.lang.IllegalArgumentException: Servlet mapping specifies an unknown servlet name HelloWorld at org.apache.catalina.core.StandardContext.addServletMapping(StandardContext.java:3124) at org.apache.catalina.core.StandardContext.addServletMapping(StandardContext.java:3103) at org.apache.catalina.startup.ContextConfig.configureContext(ContextConfig.java:1367) at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1181) at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:771) at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:298) at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:94) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5076) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:152) ... 6 more Aug 10, 2017 3:15:42 PM org.apache.catalina.core.ContainerBase startInternal SEVERE: A child container failed during start java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost]] at java.util.concurrent.FutureTask.report(Unknown Source) at java.util.concurrent.FutureTask.get(Unknown Source) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:911) at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:152) at org.apache.catalina.core.StandardService.startInternal(StandardService.java:422) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:152) at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:791) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:152) at org.apache.catalina.startup.Catalina.start(Catalina.java:655) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:355) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:495) Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost]] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:158) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1403) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1393) at java.util.concurrent.FutureTask.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) Caused by: org.apache.catalina.LifecycleException: A child container failed during start at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:919) at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:890) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:152) ... 6 more Aug 10, 2017 3:15:42 PM org.apache.catalina.startup.Catalina start SEVERE: The required Server component failed to start so Tomcat is unable to start. org.apache.catalina.LifecycleException: Failed to start component [StandardServer[8005]] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:158) at org.apache.catalina.startup.Catalina.start(Catalina.java:655) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:355) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:495) Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardService[Catalina]] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:158) at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:791) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:152) ... 7 more Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina]] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:158) at org.apache.catalina.core.StandardService.startInternal(StandardService.java:422) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:152) ... 9 more Caused by: org.apache.catalina.LifecycleException: A child container failed during start at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:919) at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:152) ... 11 more Aug 10, 2017 3:15:42 PM org.apache.coyote.AbstractProtocol pause INFO: Pausing ProtocolHandler ["http-nio-8082"] Aug 10, 2017 3:15:42 PM org.apache.coyote.AbstractProtocol pause INFO: Pausing ProtocolHandler ["ajp-nio-8009"] Aug 10, 2017 3:15:42 PM org.apache.catalina.core.StandardService stopInternal INFO: Stopping service Catalina Aug 10, 2017 3:15:42 PM org.apache.coyote.AbstractProtocol destroy INFO: Destroying ProtocolHandler ["http-nio-8082"] Aug 10, 2017 3:15:42 PM org.apache.coyote.AbstractProtocol destroy INFO: Destroying ProtocolHandler ["ajp-nio-8009"] 构造函数添加到您的视图中。 XML使用它来创建视图的实例。

如果您使用xml

,则无需使用Domino(Context context, AttributeSet attrs)手动添加它

答案 1 :(得分:1)

您应该创建此构造函数

public Domino(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
/*do here all what you want with custom view*/
}

答案 2 :(得分:1)

你必须像这样添加所有4个超级构造函数。

public class Domino extends LinearLayout {
    public Domino(Context context) {
        super(context);
    }

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

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

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public Domino(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }
}

答案 3 :(得分:1)

我可能错了,但你只是在扩展LinearLayout(这就是你想要的吗?)。 如果您希望每次引用Domino视图时都显示自定义布局,则需要在构造函数中对布局进行膨胀。请参阅其他问题中的以下代码:

public Card(Context context) {
    super(context);

    View view =  LayoutInflater.from(getContext()).inflate(
            R.layout.card, null);

    this.addView(view);

}

没有必要使用&#34; this.addView(view);&#34;像另一个问题,如果你使用以下膨胀方法。

LayoutInflater.from(getContext()).inflate(R.layout.card, this, true);

所以,你的domino.xml将是以下(例子):

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <TextView android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="LEFT"
        android:textColor="#000000"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="RIGHT"
        android:textColor="#000000"/>
</LinearLayout>

您的Domino类(示例):

public class Domino extends LinearLayout {

    public Domino (Context context) {
        super(context);

        View view =  LayoutInflater.from(getContext()).inflate(R.layout.domino, this, true);

        // Customize your view, E.g.:
        TextView textView = view.findViewById(R.id.text);
        textView.setText("Foobar domino");
    }

    // add the following if you like to reference Domino View in a Layout
    public Domino(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);

        View view = LayoutInflater.from(getContext()).inflate(R.layout.domino, this, true);

        // Customize your view, E.g.:
        TextView textView = view.findViewById(R.id.text);
        textView.setText("Foobar domino");
    }
}

您的活动将是相同的(如果您正在尝试动态添加Domino视图)或在MainActivity布局中引用您的Domino视图。

良好的编码。