有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

来自Android子类的textView上的java setText()

首先,我是Android开发的初学者! 在我的应用程序中,我包含了一个库,可以帮助我创建卡片用户界面。 在这个库中,您有一个基本的布局,其中有一个标题、描述和缩略图,但您可以创建和膨胀自定义布局,以便更好地填充卡片

我想做的是更改来自子类的TextView的文本,该子类链接到子布局。但是每次我试图从MainActivity调用setText方法时,都会得到一个NullPointerexception

这是我的小班:

    import it.gmariotti.cardslib.library.internal.Card;
    import it.gmariotti.cardslib.library.internal.Card.OnCardClickListener;
    import 安卓.content.Context;
    import 安卓.view.View;
    import 安卓.view.ViewGroup;
    import 安卓.widget.TextView;
    import 安卓.widget.Toast;

    public class CustomCardAccueil extends Card{




    public TextView TitreExtensionAccueil;
    public TextView DateSortieAccueil;
    public TextView NombreCarteAccueil;
    public TextView DescriptionExtensionAccueil;
    public TextView RareteCarteAccueil;
    public TextView DetailExtensionAccueil;


    public CustomCardAccueil(Context context) {
        this(context, R.layout.accueil_mycard_inner_content);
    }

    /**
     *
     * @param context
     * @param innerLayout
     */
    public CustomCardAccueil(Context context, int innerLayout) {
        super(context, innerLayout);
        init();
    }

    /**
     * Init
     */
    private void init(){

        //No Header

        //Set a OnClickListener listener
        setOnClickListener(new OnCardClickListener() {
            @Override
            public void onClick(Card card, View view) {
                Toast.makeText(getContext(), "Click Listener card=", Toast.LENGTH_LONG).show();
            }
        });
    }




    @Override
    public void setupInnerViewElements(ViewGroup parent, View view) {

        TitreExtensionAccueil = (TextView) parent.findViewById(R.id.TitreExtensionAccueil);



    }

}

我要更改的文本视图所在的布局:

    <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:安卓="http://schemas.安卓.com/apk/res/安卓"
    安卓:layout_width="match_parent"
    安卓:layout_height="match_parent" >

     <TextView
        安卓:id="@+id/TitreExtensionAccueil"
        安卓:layout_width="wrap_content"
        安卓:layout_height="wrap_content"
        安卓:layout_centerVertical="true"
        安卓:layout_marginLeft="20dp"
        安卓:layout_marginTop="20dp"
        安卓:textStyle="bold"
        安卓:textAppearance="?安卓:attr/textAppearanceMedium" />

    <TextView
        安卓:id="@+id/DateSortieAccueil"
        安卓:layout_width="wrap_content"
        安卓:layout_height="wrap_content"
        安卓:layout_below="@+id/TitreExtensionAccueil"
        安卓:layout_centerVertical="true"
        安卓:layout_marginLeft="20dp"
        安卓:layout_marginTop="20dp"
        安卓:textAppearance="?安卓:attr/textAppearanceMedium" />

    <TextView
        安卓:id="@+id/NombreCarteAccueil"
        安卓:layout_width="wrap_content"
        安卓:layout_height="wrap_content"
        安卓:layout_below="@+id/DateSortieAccueil"
        安卓:layout_centerVertical="true"
        安卓:layout_marginLeft="20dp"
        安卓:layout_marginTop="20dp"
        安卓:textAppearance="?安卓:attr/textAppearanceMedium" />

    <TextView
        安卓:id="@+id/DescriptionExtensionAccueil"
        安卓:layout_width="wrap_content"
        安卓:layout_height="wrap_content"
        安卓:layout_below="@+id/NombreCarteAccueil"
        安卓:layout_centerVertical="true"
        安卓:layout_marginLeft="20dp"
        安卓:layout_marginTop="20dp"
        安卓:textAppearance="?安卓:attr/textAppearanceMedium" />

    <TextView
        安卓:id="@+id/RareteCarteAccueil"
        安卓:layout_width="wrap_content"
        安卓:layout_height="wrap_content"
        安卓:layout_below="@+id/DescriptionExtensionAccueil"
        安卓:layout_centerVertical="true"
        安卓:layout_marginLeft="20dp"
        安卓:layout_marginTop="20dp"
        安卓:textAppearance="?安卓:attr/textAppearanceMedium" />

    <TextView
        安卓:id="@+id/DetailExtensionAccueil"
        安卓:layout_width="wrap_content"
        安卓:layout_height="wrap_content"
        安卓:layout_below="@+id/RareteCarteAccueil"
        安卓:layout_centerVertical="true"
        安卓:layout_marginLeft="20dp"
        安卓:layout_marginTop="20dp"
        安卓:textAppearance="?安卓:attr/textAppearanceMedium" />

</RelativeLayout>

下面是我如何尝试在我的MainActivity的OnCreate中更改TextView的内容:

CustomCardAccueil.TitreExtensionAccueil.setText("Test");

还有一个错误,我在坠机日志中得到:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void 安卓.widget.TextView.setText.setText(java.lang.CharSequence)' on a null object reference

我不理解错误,因为对象已启动(如果我错了,请纠正我)。 此外,如果我尝试更改子类(CustomCardAccueil)中的文本,这是成功的,但我需要通过我的MainActivity来完成

感谢您的帮助,提前谢谢


共 (5) 个答案

  1. # 1 楼答案

    当你试图设置文本时,你的TitreExtensionAccueil被认为是空的。 你可能想指出CustomCardAccueil在哪里。TitreExtensionAccueil。setText(“测试”);要求更好地回答您的问题

  2. # 2 楼答案

    您的问题是,或者您没有使用类CustomCardAccueil的正确实例,因为您通过它声明并初始化了TextView,因此,即使您必须从类中创建一个实例,或者将TextView声明为static变量,但在尝试设置TextView值之前,请确保运行名为setupInnerViewElements()的方法

    更新:

    要通过某些布局获取当前窗口视图,请执行以下操作:

    View global_view = getWindow().getDecorView(); // use that in the MainActivity to get the view
    

    然后,将该view传递给方法setupInnerViewElements(),只需使用它而不是使用ViewGroup创建视图:

    在您的主要活动中:

    CustomCardAccueil mCard = new CustomCardAccueil(getApplicationContext(), R.layout.accueil_mycard_inner_content);
    mCard.setupInnerViewElements(parent, global_view);
    

    setupInnerViewElements()方法中:

     @Override
        public void setupInnerViewElements(ViewGroup parent, View view) {
    
            TitreExtensionAccueil = (TextView) view.findViewById(R.id.TitreExtensionAccueil);
    
        }
    
  3. # 3 楼答案

    Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText.setText(java.lang.CharSequence)' on a null object reference

    显示您在null对象上调用了setText(),那么您初始化了CustomCardAccueil.TitreExtensionAccueil了吗

  4. # 4 楼答案

    我通过查看卡片库和他的设置标题库找到了答案(我不知道为什么我没有早点想到!)

    在CustomCardAccueil类中,我创建了如下字符串:

    protected static  String titreExtension;
    

    下面是getter和setter方法:

    public String getTitreExtension() {
    
            return titreExtension;
    
        }
    
    
        public static void setTitreExtension(String titre) {
    
            titreExtension = titre;
    
        }
    

    同样,在CustomCardAccueil中,在setupInnerViewElements方法中,我将:

    TitreExtensionAccueil = (TextView) view.findViewById(R.id.TitreExtensionAccueil);
    TitreExtensionAccueil.setText(titreExtension);
    

    在我的主要活动中,我简单地用以下方式称呼我的设定者:

    CustomCardAccueil.setTitreExtension("test du setTitreExtension");
    

    就这么简单

  5. # 5 楼答案

    您需要使用以下内容初始化该类:

    CustomCardAccueil myCard = new CustomCardAccueil(mContext, R.mylayout);
    

    您可以使用MyActivity.thisgetApplicationContext()之类的内容从活动类获取上下文。然后可以使用类“setText”之类的方法:

    myCard.setText("blah")