首先,我是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.this
或getApplicationContext()
之类的内容从活动类中获取上下文。然后你可以使用类&#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");
就这样!