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

时间:2014-12-11 10:06:12

标签: java android android-layout subclass settext

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

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

有我的子类:

    import it.gmariotti.cardslib.library.internal.Card;
    import it.gmariotti.cardslib.library.internal.Card.OnCardClickListener;
    import android.content.Context;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.TextView;
    import android.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);



    }

}

我的布局,其中有我想要更改的TextView:

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

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

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

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

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

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

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

</RelativeLayout>

我试图在OnCreate的MainActivity中更改TextView的内容:

CustomCardAccueil.TitreExtensionAccueil.setText("Test");

我在崩溃的logcat中也遇到了错误:

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

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

感谢任何帮助,提前谢谢!

5 个答案:

答案 0 :(得分:2)

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

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

您可以使用MyActivity.thisgetApplicationContext()之类的内容从活动类中获取上下文。然后你可以使用类&#39;等方法。 setText

myCard.setText("blah")

答案 1 :(得分:0)

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以及如何?

答案 2 :(得分:0)

当您尝试设置文本时,您的TitreExtensionAccueil被认为是null。 您可能想要指出CustomCardAccueil.TitreExtensionAccueil.setText(&#34; Test&#34;)的位置;被要求更好地回答你的问题。

答案 3 :(得分:0)

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

更新:

通过一些布局获取当前窗口视图:

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

    }

答案 4 :(得分:0)

我通过查看卡片库和他的setTitle图书馆找到了答案(我不知道为什么我早就没想到了!)

在我的CustomCardAccueil类中,我创建了一个String:

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

在我的MainActivity中,我只需通过以下方式调用我的setter:

CustomCardAccueil.setTitreExtension("test du setTitreExtension");

就这样!