[英]Why does findViewById returns null for CardView?
Would somebody explain why I'm getting an NPE for my cardView? 有人可以解释为什么我的cardView获得NPE吗? It makes no sense to me.
对我来说完全是无稽之谈。 Here's all relevant code and stack trace:
这是所有相关的代码和堆栈跟踪:
ACTIVITY hosting the CardView 托管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 code for the main layout 主布局的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>
Stacktrace 堆栈跟踪
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)
This is a weird issue that I've been able to recreate only once. 这是一个奇怪的问题,我只能重新创建一次。 I assumed the problem was with how I was referencing the cardview, with regards to the use of an include tag, however creating a test app to see if I can recreate this problem, there was no issue with my references.
我以为我是如何引用cardview的问题,涉及到include标签的使用,但是创建一个测试应用程序以查看是否可以重现此问题,我的引用没有问题。
PS I've omitted some methods from the activity for sake of brevity, but believe me they're irrelevant to the cause of my issue here. PS:为简洁起见,我从活动中省略了一些方法,但相信我,它们与我在这里提出问题的原因无关。 PSS I can reference any other view in that hierarchy just fine.
PSS我可以引用该层次结构中的任何其他视图。
As @Mike M. mentioned above in the comments. 正如@Mike M.在上面的评论中提到的。
First 第一
You do not need to chain your findViewById()
's like you did here: 您无需像在这里那样链接
findViewById()
:
cardView = (CardView) findViewById(R.id.tipViewCardLayoutContainer).findViewById(R.id.cardViewId);
. 。
The View
hierarchy will be searched from the top-down. 将从上至下搜索“
View
层次结构。 This means you should search for the android:id="@+id
that you want, rather than chaining them. 这意味着您应该搜索所需的
android:id="@+id
,而不要链接它们。
Second 第二
The id
android:id="@id/tipViewCardLayoutContainer"
in your <include>
overrides the id
of your root View
, this means your CardView
now has the id
of tipViewCardLayoutContainer
instead of android:id="@id/cardViewId"
. 该
id
android:id="@id/tipViewCardLayoutContainer"
在你的<include>
覆盖id
根的View
,这意味着你的CardView
现在有id
的tipViewCardLayoutContainer
而不是android:id="@id/cardViewId"
All you need to do is remove the id
from your <include>
and call 您需要做的就是从
<include>
删除id
并调用
CardView cardview = (CardView) findViewById(R.id.cardViewId);
i think id should use +id like this.hope this can help you. 我认为id应该使用+ id这样的。希望这可以帮助您。
<include
layout="@layout/tipview_card_container"
android:id="@+id/tipViewCardLayoutContainer" />
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.