无法设置ImagView的图像

时间:2014-08-31 20:09:13

标签: java android bitmap imageview

我目前正在尝试将位图图像添加到ImageView,但它正在抛出一个NPE。我不知道问题是什么,因为它在过去有效。我刚刚重新创建了项目,因为以前的工作区存在一些问题。

以下是我将位图添加到ImageView

的方法
private void insertElement(String data, String key, int i, Bitmap bm,
        boolean flag, boolean b) {
    LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View newRow = inflater.inflate(R.layout.row, null, false);
    newRow.setLayoutParams(new TableRow.LayoutParams(
            TableRow.LayoutParams.MATCH_PARENT,
            TableRow.LayoutParams.WRAP_CONTENT));

    TextView dataTextView = (TextView) newRow
            .findViewById(R.id.rowTextView);
    dataTextView.setText("\t " + data);
    ImageView iv = (ImageView) newRow.findViewById(R.id.imageView);
    newRow.setId(i);
    newRow.setOnClickListener(new OnClickListener() {
        //ommited
    });

    View v = new View(this);
    v.setLayoutParams(new TableRow.LayoutParams(
            TableRow.LayoutParams.MATCH_PARENT, 1));
    v.setBackgroundColor(Color.argb(18, 111, 111, 111));

    dataTextView.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
    int sf = 1;
    if (i == 0) {
        sf = 2;
        dataTextView.setShadowLayer(3, 0, 0, Color.BLACK);
        dataTextView.setTextColor(getResources().getColor(R.color.white));
    }

    if (bm == null && iv == null) {
        iv.setVisibility(View.GONE);
    } else {
        iv.setImageBitmap(bm);  // <---------- Error here

        /**             !original code!
         * iv.setImageBitmap(getCroppedBitmap(Bitmap.createScaledBitmap(
                Bitmap.createScaledBitmap(bm, bm.getWidth() / 2 * sf,
                        bm.getWidth() / 2 * sf, true),
                dataTextView.getMeasuredHeight() * sf,
                dataTextView.getMeasuredHeight() * sf, true), iv, key));
         */

    }

    if (flag) {
        dataTextView.setTextSize(40);

        tableScrollView.addView(newRow, i);
    } else {
        tlcard.addView(newRow, i - 1);
        if (!b) {
            tlcard.addView(v, i);
        }
    }
}

抛出异常的行是iv.setImageBitmap(bm)。显然,bm不是null,而iv也不是。

以下是xml文件,我将iv从{<1}}充气:

<?xml version="1.0" encoding="utf-8"?>
<TableRow xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/activity_horizontal_margin" >
<RelativeLayout
    android:id="@+id/rowRelativeLayout"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >

    <ImageView
        android:id="@+id/rowImageView"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_alignParentLeft="true"
        android:scaleType="center" />

    <LinearLayout
        android:layout_width="1dp"
        android:layout_height="match_parent" >

        <View style="@style/Divider" />
    </LinearLayout>

    <TextView
        android:id="@+id/rowTextView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerVertical="true"
        android:layout_toRightOf="@+id/imageView"
        android:textColor="@color/black"
        android:textSize="20sp"> </TextView>
</RelativeLayout>
</TableRow>

我尝试通过检查是否有任何组件为空来确定问题,但ivbm不是。

编辑:这是完整的错误日志:

08-31 21:29:39.693: W/System.err(32495): java.lang.NullPointerException
08-31 21:29:39.693: W/System.err(32495):    at com.tabcards.android.Search.insertElement(Search.java:422)
08-31 21:29:39.693: W/System.err(32495):    at com.tabcards.android.Search.createUI(Search.java:245)
08-31 21:29:39.693: W/System.err(32495):    at com.tabcards.android.Search.access$1(Search.java:224)
08-31 21:29:39.693: W/System.err(32495):    at com.tabcards.android.Search$1$1.run(Search.java:116)
08-31 21:29:39.693: W/System.err(32495):    at android.os.Handler.handleCallback(Handler.java:725)
08-31 21:29:39.693: W/System.err(32495):    at android.os.Handler.dispatchMessage(Handler.java:92)
08-31 21:29:39.693: W/System.err(32495):    at android.os.Looper.loop(Looper.java:158)
08-31 21:29:39.693: W/System.err(32495):    at android.app.ActivityThread.main(ActivityThread.java:5751)
08-31 21:29:39.693: W/System.err(32495):    at java.lang.reflect.Method.invokeNative(Native Method)
08-31 21:29:39.693: W/System.err(32495):    at java.lang.reflect.Method.invoke(Method.java:511)
08-31 21:29:39.693: W/System.err(32495):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1083)
08-31 21:29:39.693: W/System.err(32495):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:850)
08-31 21:29:39.698: W/System.err(32495):    at dalvik.system.NativeStart.main(Native Method)

编辑:.java文件中的ID与.xml

中的ID不匹配

2 个答案:

答案 0 :(得分:1)

问题是你的if语句检查:

if (bm == null && iv == null) {
    iv.setVisibility(View.GONE);
}

因此,如果其中一个为null,则else块确实可以执行。如果它们都为空,它就不会执行。

编辑:

如果您已将其更改为

之类的内容
if (bm == null || iv == null) {
    iv.setVisibility(View.GONE);
}

错误仍然存​​在,这意味着iv是null,而不是bm,因为你试图在它上面调用一个方法并且它失败了。

这意味着

ImageView iv = (ImageView) newRow.findViewById(R.id.imageView);

某种程度上是失败的。

答案 1 :(得分:1)

如果两个值均为true,则条件(boolean && boolean)仅返回true。所以true && false - &gt; false。所以其中一个可能是null。使用||的{​​{1}} instaed,如果其中一个条件为真,则返回true。