GVKun编程网logo

设置LayoutParams时发生NullPointerException(layout(null))

13

在这篇文章中,我们将带领您了解设置LayoutParams时发生NullPointerException的全貌,包括layout(null)的相关情况。同时,我们还将为您介绍有关android–Cla

在这篇文章中,我们将带领您了解设置LayoutParams时发生NullPointerException的全貌,包括layout(null)的相关情况。同时,我们还将为您介绍有关android – ClassCastException LinearLayout LayoutParams、android – ClassCastException:AbsListView $LayoutParams无法强制转换为Gallery $LayoutParams、android – NullPointerException在TextView.checkForRelayout(),而setText()、android – 为什么使用标准BillingService会发生NullPointerException?的知识,以帮助您更好地理解这个主题。

本文目录一览:

设置LayoutParams时发生NullPointerException(layout(null))

设置LayoutParams时发生NullPointerException(layout(null))

我想以编程方式添加一个按钮,也应该设置LayoutParams。不幸的是,该应用程序给出了一个例外:

java.lang.NullPointerException:尝试在空对象引用上写入字段“ int android.view.ViewGroup $
LayoutParams.height”

我不知道为什么。你可以帮帮我吗?这是我的代码。

 Button b = new Button(getApplicationContext());        b.setText(R.string.klick);        ViewGroup.LayoutParams params = b.getLayoutParams();        params.height = ViewGroup.LayoutParams.MATCH_PARENT;        params.height = ViewGroup.LayoutParams.WRAP_CONTENT;

答案1

小编典典

由于您以编程方式创建Button,b因此不会设置任何布局参数。因此,您需要像这样手动设置它们:

ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);b.setLayoutParams(params);

或者至少在更改参数之前检查参数是否不为null

    ViewGroup.LayoutParams params = b.getLayoutParams();    if (params != null) {        params.width= ViewGroup.LayoutParams.MATCH_PARENT;        params.height = ViewGroup.LayoutParams.WRAP_CONTENT;    } else        params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);

android – ClassCastException LinearLayout LayoutParams

android – ClassCastException LinearLayout LayoutParams

我有一个Actionbar和一些片段.问题是我的主屏幕.有一个概述左侧的片段和右侧的细节片段.我的TabListener是动态的,所以我想以编程方式设置我的布局的重量.每当我尝试获取我的LinearLayout的Layoutparams我得到一个ClassCastException:
12-22 16:00:37.620: W/System.err(7235): java.lang.classCastException: android.widget.FrameLayout$LayoutParams cannot be cast to android.widget.LinearLayout$LayoutParams
12-22 16:00:37.625: W/System.err(7235):     at com.coover.eu.lostandfound.ListSearchFragment.onViewCreated(ListSearchFragment.java:184)
12-22 16:00:37.625: W/System.err(7235):     at android.support.v4.app.FragmentManagerImpl.movetoState(FragmentManager.java:884)
12-22 16:00:37.630: W/System.err(7235):     at android.support.v4.app.FragmentManagerImpl.movetoState(FragmentManager.java:1080)
12-22 16:00:37.630: W/System.err(7235):     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:622)
12-22 16:00:37.630: W/System.err(7235):     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1416)
12-22 16:00:37.630: W/System.err(7235):     at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:505)
12-22 16:00:37.630: W/System.err(7235):     at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1178)
12-22 16:00:37.635: W/System.err(7235):     at android.app.Activity.performStart(Activity.java:5216)
12-22 16:00:37.635: W/System.err(7235):     at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:2083)
12-22 16:00:37.635: W/System.err(7235):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135)
12-22 16:00:37.635: W/System.err(7235):     at android.app.ActivityThread.access$700(ActivityThread.java:140)
12-22 16:00:37.635: W/System.err(7235):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237)
12-22 16:00:37.640: W/System.err(7235):     at android.os.Handler.dispatchMessage(Handler.java:99)
12-22 16:00:37.640: W/System.err(7235):     at android.os.Looper.loop(Looper.java:137)
12-22 16:00:37.640: W/System.err(7235):     at android.app.ActivityThread.main(ActivityThread.java:4921)
12-22 16:00:37.640: W/System.err(7235):     at java.lang.reflect.Method.invokeNative(Native Method)
12-22 16:00:37.640: W/System.err(7235):     at java.lang.reflect.Method.invoke(Method.java:511)
12-22 16:00:37.645: W/System.err(7235):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
12-22 16:00:37.645: W/System.err(7235):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
12-22 16:00:37.645: W/System.err(7235):     at dalvik.system.NativeStart.main(Native Method)

膨胀的布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" 
    android:id="@+id/container_found_list_overview">

    <EditText android:id="@+id/search_Box" 
        android:layout_width="fill_parent"
        android:layout_height="50dp"
        android:padding="5dp"
        android:textSize="35sp"
        android:hint="@string/search"
        android:inputType="text"
        android:maxLines="1"/>
    <ListView 
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/overview_list_view">
    </ListView>

</LinearLayout>

代码:

LinearLayout myView = (LinearLayout)this.getView().findViewById(R.id.container_found_list_overview);
            Log.d("found container",""+(myView != null));
            try{
                LayoutParams lp = (LayoutParams) myView.getLayoutParams();
                lp.weight = 1;
                lp.width = 0;
                myView.setLayoutParams(lp);
            }
            catch(RuntimeException e){
                Log.e("cant get layoutparams",e.getMessage());
                e.printstacktrace();
            }

解决方法

发生的是一个视图的LayoutParams实际上是父类的类型.在这种情况下,您将获得一个FrameLayout $LayoutParams,因为您的LinearLayout位于FrameLayout中.

为什么是父母的类型?这是因为他们存储对父母有用的信息.如果要检索EditText或ListView的布局参数,您将获得LinearLayout $LayoutParams.

android – ClassCastException:AbsListView $LayoutParams无法强制转换为Gallery $LayoutParams

android – ClassCastException:AbsListView $LayoutParams无法强制转换为Gallery $LayoutParams

我正在尝试开发 Android 3.1平板电脑应用程序.

这个应用程序将有很多图像,我已经按照Processing Bitmaps Off the UI Thread教程,但我做错了,因为我得到:

java.lang.classCastException:android.widget.AbsListView $LayoutParams无法强制转换为android.widget.gallery $LayoutParams

这是我的代码:

我在一个Activity上设置了gallery

mFactgallery = (gallery)mView.findViewById(R.id.factgallery);
mFactgallery.setAdapter(new ImagegalleryAdapter(mActivity,ImageView.ScaleType.FIT_END,180,90));

ImagegalleryAdapter.java

public class ImagegalleryAdapter extends BaseAdapter
{
    private ArrayList<String> mImagesPath;
    private Context mContext;
    private int mWidth;
    private int mHeight;

    public ArrayList<String> getmImagesPath()
    {
        return mImagesPath;
    }

    public void setmImagesPath(ArrayList<String> mImagesPath)
    {
        this.mImagesPath = mImagesPath;
    }

    public void addImage(String imagePath)
    {
        mImagesPath.add(imagePath);
    }

    public ImagegalleryAdapter(Context context,ImageView.ScaleType scaleType,int width,int height)
    {
        mContext = context;
        mWidth = width;
        mHeight = height;
        mScaleType = scaleType;

        mImagesPath = new ArrayList<String>();
    }

    @Override
    public int getCount()
    {
        return mImagesPath.size();
    }

    @Override
    public Object getItem(int position)
    {
        return position;
    }

    @Override
    public long getItemId(int position)
    {
        return position;
    }

    @Override
    public View getView(int position,View convertView,ViewGroup parent)
    {
        // Get a View to display image data                     
        ImageView imageView;
        // if it's not recycled,initialize some attributes
        if (convertView == null)
        {
            imageView = new ImageView(mContext);
            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
            imageView.setLayoutParams(new GridView.LayoutParams(
                    LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT));
        }
        else
        {
            imageView = (ImageView) convertView;
            // Recicla el Bitmap.
            Bitmap bm = ((BitmapDrawable) imageView.getDrawable()).getBitmap();
            if (bm != null)
                bm.recycle();
        }

        String filePath = mImagesPath.get(position);
        if (BitmapTools.cancelPotentialWork(filePath,imageView))
        {
            String[] params = {filePath,Integer.toString(mWidth),Integer.toString(mHeight)};
            final BitmapWorkerTask task = new BitmapWorkerTask(imageView);
            final AsyncDrawable asyncDrawable =
                    new AsyncDrawable(mContext.getResources(),filePath,task);
            imageView.setimageDrawable(asyncDrawable);
            task.execute(params);
        }

        return imageView;
    }
}

BitmapWorkerTask.java

public class BitmapWorkerTask extends AsyncTask<String,Void,Bitmap>
{
    private final WeakReference<ImageView> imageViewReference;
    public String imgPath = "";

    public BitmapWorkerTask(ImageView imageView) {
        // Use a WeakReference to ensure the ImageView can be garbage collected
        imageViewReference = new WeakReference<ImageView>(imageView);
    }

    // Decode image in background.
    @Override
    protected Bitmap doInBackground(String... params)
    {
        imgPath = params[0];
        int width = Integer.valueOf(params[1]).intValue();
        int height = Integer.valueOf(params[2]).intValue();
        return BitmapTools.decodeSampledBitmapFromdisk(imgPath,width,height);
    }

    // Once complete,see if ImageView is still around and set bitmap.
    @Override
    protected void onPostExecute(Bitmap bitmap)
    {
        if (isCancelled())
        {
            bitmap = null;
        }

        if (imageViewReference != null && bitmap != null)
        {
            final ImageView imageView = imageViewReference.get();
            final BitmapWorkerTask bitmapWorkerTask =
                    BitmapTools.getBitmapWorkerTask(imageView);
            if (this == bitmapWorkerTask && imageView != null)
            {
                imageView.setimageBitmap(bitmap);
            }
        }
    }
}

AsyncDrawable.java

public class AsyncDrawable extends BitmapDrawable
{
    private final WeakReference<BitmapWorkerTask> bitmapWorkerTaskReference;

    public AsyncDrawable(Resources res,String filepath,BitmapWorkerTask bitmapWorkerTask)
    {
        super(res,filepath);
        bitmapWorkerTaskReference =
            new WeakReference<BitmapWorkerTask>(bitmapWorkerTask);
    }

    public BitmapWorkerTask getBitmapWorkerTask()
    {
        return bitmapWorkerTaskReference.get();
    }
}

我究竟做错了什么?

解决方法

用gallery.LayoutParams替换GridView.LayoutParams,如下所示,这将解决您的问题
imageView.setLayoutParams(new gallery.LayoutParams(
                    LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT));

android – NullPointerException在TextView.checkForRelayout(),而setText()

android – NullPointerException在TextView.checkForRelayout(),而setText()

我试图实现ViewHolder模式,以便在绘图上绘制地图时提高性能.
我需要为我的标记创建一些标签.在draw()中的数据处理中调用此方法
// Now we create label view and convert it into bitmap
private Bitmap createLabelBitmap(GisLaborHistoryObject object,HistoryPoint point) {
    // create view from xml
    if (vh == null) {
        vh = new ViewHolder();
        vh.view = inflater.inflate(R.layout.map_gis_history_label,null,false);
        vh.tv = (TextView) vh.view.findViewById(R.id.gislabeltext);
    }

    // set label content
    if (vh.tv != null) {
        if (!mSingleLaborHistory) {
            String name = "";
            name = object.getdisplayName();
            if (name == null || "".equals(name))
                name = object.getPersonId();
            if (name == null || "".equals(name))
                name = object.getLaborCode();
            if (name == null)
                name = "";

            vh.tv.setText(name);
        } else
            vh.tv.setText(point.getChangeDate());
    } 
    // measure resulting view
    vh.view.measure(spec,spec);
    vh.view.layout(0,vh.view.getMeasuredWidth(),vh.view.getMeasuredHeight());
    Bitmap b = Bitmap.createBitmap(vh.view.getWidth(),vh.view.getHeight(),Bitmap.Config.ARGB_8888);
    canvasToDraw.setBitmap(b);
    canvasToDraw.translate(-vh.view.getScrollX(),-vh.view.getScrollY());
    vh.view.draw(canvasToDraw);
    return b;
}

规格是

spec = MeasureSpec.makeMeasureSpec(0,MeasureSpec.UNSPECIFIED);

结果是
logcat的:

04-29 17:12:34.057: E/AndroidRuntime(389): java.lang.NullPointerException
 04-29 17:12:34.057: E/AndroidRuntime(389):     at android.widget.TextView.checkForRelayout(TextView.java:5497)
 04-29 17:12:34.057: E/AndroidRuntime(389):     at android.widget.TextView.setText(TextView.java:2730)
 04-29 17:12:34.057: E/AndroidRuntime(389):     at android.widget.TextView.setText(TextView.java:2598)
 04-29 17:12:34.057: E/AndroidRuntime(389):     at android.widget.TextView.setText(TextView.java:2573)
 04-29 17:12:34.057: E/AndroidRuntime(389):     at com.xxx.android.proj.ui.map.overlays.LaborsMarkerOverlay.createLabelBitmap(LaborsMarkerOverlay.java:164)

我使用的XML布局

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gislabeltext"android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="2dp"
android:paddingRight="2dp" />

可能是这个错误的原因?

解决方法

在看到android source code在5497行我注意到有一个检查使用mLayoutParams.我在调试模式下看起来就是这样,真的是空的!
我添加明确设置此参数的行.现在一切正常
vh.tv = (TextView) vh.view.findViewById(R.id.gislabeltext);
vh.tv.setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));

我的错误是,当使用ViewGroup膨胀时,我必须显式设置LayoutParams root = null;一切正常,直到我尝试重用TextView乘法时间.

android – 为什么使用标准BillingService会发生NullPointerException?

android – 为什么使用标准BillingService会发生NullPointerException?

我在我的应用程序中使用标准BillingService(即从sample application复制而不做更改).
但有时我的应用程序崩溃与logcat中的以下数据:

04-16 10:05:43.556: INFO/ActivityManager(96): Start proc tv.kinobaza.app for service tv.kinobaza.app/tv.kinobaza.billing.BillingService: pid=28748 uid=10081 gids={3003}
04-16 10:05:43.646: DEBUG/AndroidRuntime(28748): Shutting down VM
04-16 10:05:43.656: WARN/dalvikvm(28748): threadid=1: thread exiting with uncaught exception (group=0x400259f8)
04-16 10:05:43.656: ERROR/AndroidRuntime(28748): FATAL EXCEPTION: main
04-16 10:05:43.656: ERROR/AndroidRuntime(28748): java.lang.RuntimeException: Unable to start service tv.kinobaza.billing.BillingService@4632f578 with null: java.lang.NullPointerException
04-16 10:05:43.656: ERROR/AndroidRuntime(28748):     at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3282)
04-16 10:05:43.656: ERROR/AndroidRuntime(28748):     at android.app.ActivityThread.access$3600(ActivityThread.java:135)
04-16 10:05:43.656: ERROR/AndroidRuntime(28748):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2211)
04-16 10:05:43.656: ERROR/AndroidRuntime(28748):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-16 10:05:43.656: ERROR/AndroidRuntime(28748):     at android.os.Looper.loop(Looper.java:144)
04-16 10:05:43.656: ERROR/AndroidRuntime(28748):     at android.app.ActivityThread.main(ActivityThread.java:4937)
04-16 10:05:43.656: ERROR/AndroidRuntime(28748):     at java.lang.reflect.Method.invokeNative(Native Method)
04-16 10:05:43.656: ERROR/AndroidRuntime(28748):     at java.lang.reflect.Method.invoke(Method.java:521)
04-16 10:05:43.656: ERROR/AndroidRuntime(28748):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
04-16 10:05:43.656: ERROR/AndroidRuntime(28748):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
04-16 10:05:43.656: ERROR/AndroidRuntime(28748):     at dalvik.system.NativeStart.main(Native Method)
04-16 10:05:43.656: ERROR/AndroidRuntime(28748): Caused by: java.lang.NullPointerException
04-16 10:05:43.656: ERROR/AndroidRuntime(28748):     at tv.kinobaza.billing.BillingService.onStart(UnkNown Source)
04-16 10:05:43.656: ERROR/AndroidRuntime(28748):     at android.app.Service.onStartCommand(Service.java:420)
04-16 10:05:43.656: ERROR/AndroidRuntime(28748):     at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3267)
04-16 10:05:43.656: ERROR/AndroidRuntime(28748):     ... 10 more
04-16 10:05:43.736: DEBUG/SurfaceFlinger(96): Layer::setBuffers(this=0xb947a8),pid=96,w=1,h=1
04-16 10:05:43.736: DEBUG/SurfaceFlinger(96): Layer::setBuffers(this=0xb947a8),h=1
04-16 10:05:43.766: DEBUG/SurfaceFlinger(96): Layer::requestBuffer(this=0xb947a8),index=0,w=480,h=418 success
04-16 10:05:43.986: DEBUG/dalvikvm(28721): GC_FOR_MALLOC freed 9604 objects / 1369120 bytes in 102ms

这是相关的代码:

/**
 * We don't support binding to this service,only starting the service.
 */
@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public void onStart(Intent intent,int startId) {
    handleCommand(intent,startId);
}

这有什么不对?

我注意到了 – 当设备在夜间睡觉时,一旦我开始使用它,它会在约5分钟内崩溃.

并且,以下是更多详细信息:BillingService从我的应用程序的“首选项”屏幕开始.这里是Preferences类的代码:

@Override
protected void onDestroy() {
mBillingService.unbind();
    super.onDestroy();
}

UPD.也许,我应该在Main活动中启动此服务/解除绑定?

这是我的proguard.cfg:

-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.broadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService
-keep class com.android.vending.billing.**

-keepclasseswithmembernames class * {
    native java.lang.String);
}

-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}

-libraryjars /lib/libGoogleAnalytics.jar
-libraryjars /lib/signpost-commonshttp4-1.2.1.1.jar
-libraryjars /lib/signpost-core-1.2.1.1.jar
-dontwarn org.apache.commons.codec.binary.Base64
最佳答案
所以你在proguard之后得到这个NPE而不是事先.

你必须混淆一些你不应该喜欢扩展应用程序/活动/服务的类

你不应该混淆这些类:

http://proguard.sourceforge.net/index.html#/manual/examples.html(转到例7)

今天关于设置LayoutParams时发生NullPointerExceptionlayout(null)的讲解已经结束,谢谢您的阅读,如果想了解更多关于android – ClassCastException LinearLayout LayoutParams、android – ClassCastException:AbsListView $LayoutParams无法强制转换为Gallery $LayoutParams、android – NullPointerException在TextView.checkForRelayout(),而setText()、android – 为什么使用标准BillingService会发生NullPointerException?的相关知识,请在本站搜索。

本文标签: