简体   繁体   English

布局中的空指针异常

[英]Null Pointer Exception in Layout

I found Null Pointer Exception in my Layout file. 我在布局文件中发现了空指针异常。

I am using ViewPager for whatever reason I found NullPointerException. 无论我发现NullPointerException ViewPager ,我都使用ViewPager

Following is xml code for layout. 以下是用于布局的xml代码。

<?xml version="1.0" encoding="utf-8"?>
<com.mindsoulmatter.iaffirmme.ViewPagerParallax xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/viewpager"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#70000000"
    android:paddingBottom="2dp"
    android:textColor="#D7D6D6" >

    <android.support.v4.view.PagerTitleStrip
        android:id="@+id/__Weekly_pager_title_strip"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="top"
        android:background="#70000000"
        android:paddingTop="18dp"
        android:textColor="#FFFFFF"
        android:textSize="26sp" />

    <View
        android:layout_width="fill_parent"
        android:layout_height="1dp"
        android:background="#ffffff" />

</com.mindsoulmatter.iaffirmme.ViewPagerParallax>

I got following error in graphical layout: 在图形布局中出现以下错误:

java.lang.NullPointerException
Exception details are logged in Window > Show View > Error Log

java.lang.NullPointerException
    at android.graphics.Canvas.throwIfCannotDraw(Canvas.java:1083)
    at android.graphics.Canvas.drawBitmap(Canvas.java:1201)
    at com.mindsoulmatter.iaffirmme.ViewPagerParallax.onDraw(ViewPagerParallax.java:204)
    at android.view.View.draw(View.java:14465)
    at android.support.v4.view.ViewPager.draw(ViewPager.java:2171)
    at android.view.View.draw(View.java:14350)
    at android.view.ViewGroup.drawChild(ViewGroup.java:3103)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)
    at android.view.View.draw(View.java:14348)
    at android.view.ViewGroup.drawChild(ViewGroup.java:3103)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)
    at android.view.View.draw(View.java:14468)
    at android.view.View.draw(View.java:14350)
    at android.view.ViewGroup.drawChild(ViewGroup.java:3103)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)
    at android.view.View.draw(View.java:14468)

I can run the application but when I open this layout application get crashed. 我可以运行该应用程序,但是当我打开该布局应用程序时会崩溃。

This layout is called by using following fragment activity: 通过使用以下片段活动来调用此布局:

package com.mindsoulmatter.iaffirmme;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Vector;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.graphics.Typeface;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.PagerTitleStrip;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.Window;
import android.widget.TextView;

public class Activity_Fragments extends FragmentActivity {
    List<Fragment> fragments;
    Adapter_ViewPager adapter;
    ViewPagerParallax pager;
    String restoredText;
    private static String[] titles = new String[] { "Custom", "Affirmations",
            "Favorites" };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);

        setContentView(R.layout.adapter_fragment);
        RateThisApp.onStart(this);
        // Show a dialog if criteria is satisfied
        RateThisApp.showRateDialogIfNeeded(this);

        overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_left);
        fragments = new Vector<Fragment>();
        fragments.add(Fragment.instantiate(this,
                Fragment_Affirm_Custom.class.getName()));
        fragments.add(Fragment.instantiate(this,
                Fragment_Affirm.class.getName()));
        fragments.add(Fragment.instantiate(this,
                Fragment_Affirm_Favourites.class.getName()));

        // registerReceiver(broadcastCoverReceiverpara, new IntentFilter(
        // Music_service.BROADCAST_COVERPARALLAX));

        SharedPreferences prefs = getApplicationContext().getSharedPreferences(
                "udata", MODE_PRIVATE);
        this.restoredText = prefs.getString("language", null);

        if (restoredText == "english") {
            titles = new String[] { "Custom", "Affirmations", "Favorites" };
        } else if (restoredText == "spanish") {
            titles = new String[] { "Costumbre", "Afirmaciones", "Favoritos " };
        } else if (restoredText == "french") {
            titles = new String[] { "Coutume", "Affirmations", "Favoris" };
        } else {
            titles = new String[] { "Custom", "Affirmations", "Favorites" };
        }

        adapter = new Adapter_ViewPager(super.getSupportFragmentManager(),
                fragments, titles);

        pager = (ViewPagerParallax) super.findViewById(R.id.viewpager);

        pager.set_max_pages(3);
        PagerTitleStrip _Title = (PagerTitleStrip) findViewById(R.id.__Weekly_pager_title_strip);
        Typeface font = Typeface.createFromAsset(this.getAssets(),
                "fonts/julius-sans-one.ttf");
        for (int counter = 0; counter < _Title.getChildCount(); counter++) {

            if (_Title.getChildAt(counter) instanceof TextView) {
                ((TextView) _Title.getChildAt(counter)).setTypeface(font);
            }
        }
        /*int arr[] = { R.raw.a1, R.raw.a2, R.raw.a3, R.raw.a4, R.raw.a5,
                R.raw.a6, R.raw.a7, R.raw.a8, R.raw.a9, R.raw.a10, R.raw.a11,
                R.raw.a12, R.raw.a13, R.raw.a14, R.raw.a15, R.raw.a16,
                R.raw.a17, R.raw.a18, R.raw.a19, R.raw.a20, R.raw.a21,
                R.raw.a22, R.raw.a23, R.raw.a24, R.raw.a25, R.raw.a26,
                R.raw.a27, R.raw.a28, R.raw.a29, R.raw.a30, R.raw.a31,
                R.raw.a32, R.raw.a33, R.raw.a34, R.raw.a35, R.raw.a36,
                R.raw.a37, R.raw.a38, R.raw.a39, R.raw.a40, R.raw.a41 };*/

        int arr[] = { R.raw.a1, R.raw.a2, R.raw.a3, R.raw.a4,R.raw.a5};

        int x = (int) (Math.random() * ((4) + 1));
        pager.setBackgroundAsset(arr[x]);
        // pager.setPageTransformer(true, new ZoomOutPageTransformer());

        pager.setAdapter(adapter);
        pager.setOffscreenPageLimit(1);

        pager.setCurrentItem(1);

    }

    // private BroadcastReceiver broadcastCoverReceiverpara = new
    // BroadcastReceiver() {
    // @Override
    // public void onReceive(Context context, Intent serviceIntent) {
    // pager.setBackgroundAsset(serviceIntent.getStringExtra( "coverpara"));

    // }
    // };

    @Override
    public void finish() {
        super.finish();
        overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_right);
    }
}

I get error when pager.setBackgroundAsset(arr[x]) is called. pager.setBackgroundAsset(arr[x])时出现错误。

can any body please help me? 有人可以帮我吗?

I found solution. 我找到了解决方案。

There was a problem with images itself. 图像本身存在问题。

Some of the images are itself broken. 有些图像本身已损坏。

Thanks for the time guys. 谢谢你们的时间。

Looks like 看起来像

int x = (int) (Math.random() * ((4) + 1));

is giving you bad id of the array 给你不好的数组ID

Custom View can detect if they are run inside the Layout Editor (within a developer tool) with this method: 自定义View可以使用以下方法检测它们是否在布局编辑器(在开发人员工具内)中运行:

View.isInEditMode()

Apparently, the ViewPagerParallax View isn't, and therefore is using illegal method inside the Layout Editor. 显然, ViewPagerParallax视图不是,因此在布局编辑器中使用了非法方法。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM