【问题标题】:setText() on a textView coming from a subClass in Android来自 Android 子类的 textView 上的 setText()
【发布时间】:2014-12-11 10:06:11
【问题描述】:

首先我是 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>

还有我如何尝试在我的 MainActivity 中的 OnCreate 中更改 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 来完成。

任何帮助表示赞赏,在此先感谢!

【问题讨论】:

    标签: java android android-layout subclass settext


    【解决方案1】:

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

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

    您可以使用MyActivity.thisgetApplicationContext() 之类的方式从活动类中获取上下文。然后就可以使用类'setText这样的方法了:

    myCard.setText("blah")
    

    【讨论】:

    • 这似乎是逻辑!我把 CustomCardAccueil myCard = new CustomCardAccueil(getApplicationContext(), R.layout.accueil_mycard_inner_content);在我的主要活动中,myCard.TitreExtensionAccueil.setText("test");这在我的主要活动中(在 onCreate 中)但我得到了同样的错误?任何提示,我是否放错了代码?
    【解决方案2】:

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

    【讨论】:

    • 对不起,堆栈出问题了,删除了一个字!在我的 mainActivity 的 onCreate 方法中!
    【解决方案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 以及如何初始化?

    【讨论】:

    • 是的,我是这样初始化的:public TextView TitreExtensionAccueil;在 customCardAccueil.java 和 TitreExtensionAccueil = (TextView) parent.findViewById(R.id.TitreExtensionAccueil);同班
    • 您必须确保在引用 TitreExtensionAccueil 之前调用了 setupInnerViewElements()
    【解决方案4】:

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

    更新:

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

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

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

    在您的 MainActivity 中:

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

    【讨论】:

    • 这对我来说似乎不错,但我没有找到要在 MainActivity 中的 setupInnerViewElements() 中放置哪些参数
    • 好的,现在好多了!查看 global_view = getWindow().getDecorView(); CustomCardAccueil mCard = new CustomCardAccueil(getApplicationContext(), R.layout.accueil_mycard_inner_content);视图组父 = null; (因为 parent 没有初始化) mCard.setupInnerViewElements(parent, global_view); mCard.TitreExtensionAccueil.setText("测试");现在错误有点不同,调用失败的方法是 android.view.View android.view.Window.getDecorView() (在空对象引用上)所以我假设这行: View global_view = getWindow().getDecorView( ) 导致问题
    • @Synny 尝试调用的时候那个activity是什么,是主activity吗,必须从当前运行的activity中调用,或者改成global_view = this.getWindow().getDecorView()放在包含 TextView 的活动中的某处,或保存上下文以像 global_view = mContext.getWindow().getDecorView() 那样使用它
    • 如果不清楚,抱歉!事实上,这是打开的 MainActivity,但我必须更改另一个类(不是活动)中的文本,它会使我的内部布局膨胀。 global_view = this.getWindow().getDecorView() 我不能把这条线放在 CustomCardAccueil 因为它不是一个 Activity 并且 getWindows 无法识别但是在我的 MainActivity 中更改它之后(global_view = getWindow().getDecorView()到 global_view = this.getWindow().getDecorView()) 与 setText 方法相关的错误又回来了!
    • 我找到了答案。如果你愿意,看看我的帖子!
    【解决方案5】:

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

    在我的 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);
    

    在我的 MainActivity 中,我只需调用我的 setter:

    CustomCardAccueil.setTitreExtension("test du setTitreExtension");
    

    就这么简单!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-14
      相关资源
      最近更新 更多