【问题标题】:CustomView doesn't work自定义视图不起作用
【发布时间】:2017-08-07 11:33:04
【问题描述】:

我正在尝试使用代表多米诺骨牌的自定义视图类,遵循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));

    }
}

【问题讨论】:

  • domino.xml 不是 activity_main.xml 也许这是你的问题

标签: android


【解决方案1】:

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

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

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

    this.addView(view);

}

不需要使用“this.addView(view);”像另一个问题一样,如果您使用以下充气方法。

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");
    }
}

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

良好的编码。

【讨论】:

  • 你说得对,这就是我想要的......我混淆了这个问题(动态添加视图与将其用作 xml)
【解决方案2】:

Domino(Context context, AttributeSet attrs) 构造函数添加到您的视图中。 XML 使用它来创建视图的实例。

如果使用xml,则无需手动添加addView

【讨论】:

    【解决方案3】:

    你应该创建这个构造函数

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

    【讨论】:

    • 只有 1 个具有 Context 和 AttributeSet 的构造函数就足够了
    【解决方案4】:

    你必须像这样添加所有 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);
        }
    }
    

    【讨论】:

    • 只有 1 个具有 Context 和 AttributeSet 的构造函数就足够了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-21
    • 1970-01-01
    • 2020-10-12
    • 2014-04-26
    • 2020-01-18
    • 2021-08-02
    相关资源
    最近更新 更多