簡體   English   中英

為什么findViewById為CardView返回null?

[英]Why does findViewById returns null for CardView?

有人可以解釋為什么我的cardView獲得NPE嗎? 對我來說完全是無稽之談。 這是所有相關的代碼和堆棧跟蹤:

托管CardView的活動

public class MainScreen extends AppCompatActivity implements TipView.OnValueChangedListener 
{ 

 private TipView tipView;

 private CardView cardView;

 private TextView tipTextView;
 private TextView taxTextView;
 private TextView splitTextView;
 private TextView productTextView;
 private TextView totalTextView;

 private TextView youPayEachPay;


 private ImageButton productEditButton;
 private ImageButton dataToggle;

 private ProductTotalWindow productTotalWindow;



 private double productTotal = 0.0d;

 private double currentTip = 0.0d;
 private double currentTax = 0.0d;
 private int currentSplit = 1;


 private NumberFormat currencyFormat;


 private String pricesDefaults = "$0.00";

 @Override
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main_screen);


    cardView = (CardView) findViewById(R.id.tipViewCardLayoutContainer).findViewById(R.id.cardViewId);

  //NPE is thrown since, obviously the reference points to a null object
  cardView.setCardBackgroundColor(Color.RED);


    this.tipView = (TipView) findViewById(R.id.tipView);
         tipView.setOnValueChangedListener(this);



    dataToggle = (ImageButton) findViewById(R.id.dataToggle);
    dataToggle.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            expandLayout();
        }
    });



    initDataPricesViews();

    initProductEditView();

    currencyFormat = NumberFormat.getCurrencyInstance();

  }

}

主布局的XML代碼

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main_screen"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.bryan.tipease.MainScreen">


   <!--
     tipview_card_container is the layout hosting my cardview
    -->
<include
    layout="@layout/tipview_card_container"
    android:id="@id/tipViewCardLayoutContainer" />




<FrameLayout
    android:layout_alignParentBottom="true"
    android:layout_below="@id/tipViewCardLayoutContainer"
    android:id="@id/pricesTotalContainer"

    android:layout_width="match_parent"
    android:layout_height="match_parent">


<include layout="@layout/prices_layout" />

</FrameLayout>



</RelativeLayout>



//The cards xml file itself

 <?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"

    android:layout_width="match_parent"
    android:layout_height="wrap_content"

    android:id="@id/cardViewId"

    app:contentPadding="16dp"
    app:cardElevation="16dp"
    app:cardBackgroundColor="@color/tipViewCardBackground">


    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <com.example.bryan.tipease.TipView
            style="@style/WidgetTipViewStyle"

            android:id="@id/tipView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />



    <ImageButton
        style="@style/BreakerBarContent"
        android:src="@drawable/forkknifefab"
        android:id="@id/productDialogLauncher"
        android:contentDescription="@string/contentDescForkKnifeImage"

        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />


    <ImageButton
        style="@style/BreakerBarContent"
        android:src="@drawable/toggle_circle"
        android:id="@id/dataToggle"
        android:contentDescription="@string/contentDescDataToggleImage"

        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"

        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</RelativeLayout>

  </android.support.v7.widget.CardView>

堆棧跟蹤

02-23 21:06:55.548 26169-26169/? E/AndroidRuntime: FATAL EXCEPTION: main
                                               Process:  com.example.bryan.tipease, PID: 26169
                                                java.lang.RuntimeException:  Unable to start activity   ComponentInfo{com.example.bryan.tipease/com.example.bryan.tipease.MainScreen}:  java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.CardView.setCardBackgroundColor(int)' on a null object reference
                                                   at  android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2378)
                                                   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2440)
                                                   at android.app.ActivityThread.access$800(ActivityThread.java:162)
                                                   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1348)
                                                   at android.os.Handler.dispatchMessage(Handler.java:102)
                                                   at android.os.Looper.loop(Looper.java:135)
                                                   at android.app.ActivityThread.main(ActivityThread.java:5422)
                                                   at java.lang.reflect.Method.invoke(Native Method)
                                                   at java.lang.reflect.Method.invoke(Method.java:372)
                                                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:914)
                                                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:707)
                                                Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.CardView.setCardBackgroundColor(int)' on a null object reference
                                                   at com.example.bryan.tipease.MainScreen.onCreate(MainScreen.java:62)
                                                   at android.app.Activity.performCreate(Activity.java:6056)
                                                   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
                                                   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2331)
                                                   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2440) 
                                                   at android.app.ActivityThread.access$800(ActivityThread.java:162) 
                                                   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1348) 
                                                   at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                   at android.os.Looper.loop(Looper.java:135) 
                                                   at android.app.ActivityThread.main(ActivityThread.java:5422) 
                                                   at java.lang.reflect.Method.invoke(Native Method) 
                                                   at java.lang.reflect.Method.invoke(Method.java:372) 
                                                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:914) 
                                                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:707) 

這是一個奇怪的問題,我只能重新創建一次。 我以為我是如何引用cardview的問題,涉及到include標簽的使用,但是創建一個測試應用程序以查看是否可以重現此問題,我的引用沒有問題。

PS:為簡潔起見,我從活動中省略了一些方法,但相信我,它們與我在這里提出問題的原因無關。 PSS我可以引用該層次結構中的任何其他視圖。

正如@Mike M.在上面的評論中提到的。

第一

您無需像在這里那樣鏈接findViewById()

cardView = (CardView) findViewById(R.id.tipViewCardLayoutContainer).findViewById(R.id.cardViewId);

將從上至下搜索“ View層次結構。 這意味着您應該搜索所需的android:id="@+id ,而不要鏈接它們。

第二

id android:id="@id/tipViewCardLayoutContainer"在你的<include>覆蓋id根的View ,這意味着你的CardView現在有idtipViewCardLayoutContainer而不是android:id="@id/cardViewId"

您需要做的就是從<include>刪除id並調用

CardView cardview = (CardView) findViewById(R.id.cardViewId);

我認為id應該使用+ id這樣的。希望這可以幫助您。

<include
layout="@layout/tipview_card_container"
android:id="@+id/tipViewCardLayoutContainer" />

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM