【问题标题】:Parcel that I am passing is null?我传递的包裹是空的?
【发布时间】:2014-03-24 06:09:06
【问题描述】:

我不确定如何正确构建这个地块;当我尝试从我的MainActivity 添加包裹的对象时,我将返回null

发送intent:

public void onClick(View v) {
            Intent myIntent = new Intent(listaddactivity.this,
                    MainActivity.class);

            myIntent.putExtra(
                    "custom_object",
                    new listControlObject(namefield.getText().toString(),
                            iterator, temperatureFrag.getCurrentTempType(), Integer
                                    .valueOf(powerPercent.getText()
                                            .toString()), Integer
                                    .valueOf(frequencyField.getText()
                                            .toString()),
                            temperatureFrag.temperaturenumberpicker
                                    .getValue(), cycleFrag.startTimeField
                                    .getCurrentHour(),
                            cycleFrag.startTimeField.getCurrentMinute(),
                            cycleFrag.cycleDatePicker.getDayOfMonth(),
                            cycleFrag.cycleDatePicker.getMonth(), Integer
                                    .valueOf(cycleFrag.numberOfCyclesField
                                            .getText().toString()))); // Optional
                                                                        // parameters
            startActivity(myIntent);
            Log.d("LISTACTIVITY", "Intent successfully passed!");
            iterator++;  
        }

    });
}

接收activity:

 public class MainActivity extends FragmentActivity implements
        ActionBar.TabListener {
    String TAG;


    HomeFragment homeFragment;
    cycleviewfragment cyclefragment;
    SectionsPagerAdapter mSectionsPagerAdapter;

    /**
     * The {@linkCustomViewPager} that will host the section contents.
     */
    CustomViewPager mViewPager;

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

        // Set up the action bar.
        final ActionBar actionBar = getActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        homeFragment = new HomeFragment();
        cyclefragment = new cycleviewfragment();
        // Create the adapter that will return a fragment for each of the three
        // primary sections of the app.
        mSectionsPagerAdapter = new SectionsPagerAdapter(
                getSupportFragmentManager());

        // Set up theCustomViewPager with the sections adapter.
        mViewPager = (CustomViewPager) findViewById(R.id.pager);
        mViewPager.setAdapter(mSectionsPagerAdapter);
        mViewPager.setPagingEnabled(false);
        // When swiping between different sections, select the corresponding
        // tab. We can also use ActionBar.Tab#select() to do this if we have
        // a reference to the Tab.
        mViewPager
                .setOnPageChangeListener(new CustomViewPager.SimpleOnPageChangeListener() {
                    @Override
                    public void onPageSelected(int position) {
                        actionBar.setSelectedNavigationItem(position);
                    }
                });

        // For each of the sections in the app, add a tab to the action bar.
        for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {
            // Create a tab with text corresponding to the page title defined by
            // the adapter. Also specify this Activity object, which implements
            // the TabListener interface, as the callback (listener) for when
            // this tab is selected.
            actionBar.addTab(actionBar.newTab()
                    .setText(mSectionsPagerAdapter.getPageTitle(i))
                    .setTabListener(this));
        }
        processNewIntent(getIntent());


    }
    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        processNewIntent(intent);
    }

    private void processNewIntent(Intent intent) {
        Log.v("TEST", "METHOD CALLED TEST");
        if (intent.hasExtra("custom_object")) {
            cyclefragment.a1.add((listControlObject) intent.getParcelableExtra("custom_object"));
            cyclefragment.adapter.notifyDataSetChanged();
        }
    }

我发送intent 时是否错误地执行了包裹?我的processNewIntent 给我NullPointerException 有什么原因吗?

我猜有一种特定的方法可以构造一个包裹并将其传递给我没有正确实现的意图,但我找不到任何好的资源。

Logcat:

   03-24 01:13:30.846: E/Trace(7974): error opening trace file: No such file or directory (2)
03-24 01:13:44.374: E/AndroidRuntime(7974): FATAL EXCEPTION: main
03-24 01:13:44.374: E/AndroidRuntime(7974): java.lang.NullPointerException
03-24 01:13:44.374: E/AndroidRuntime(7974):     at com.nanospark.upcdemo.listaddactivity$1.onClick(listaddactivity.java:72)
03-24 01:13:44.374: E/AndroidRuntime(7974):     at android.view.View.performClick(View.java:4091)
03-24 01:13:44.374: E/AndroidRuntime(7974):     at android.view.View$PerformClick.run(View.java:17072)
03-24 01:13:44.374: E/AndroidRuntime(7974):     at android.os.Handler.handleCallback(Handler.java:615)
03-24 01:13:44.374: E/AndroidRuntime(7974):     at android.os.Handler.dispatchMessage(Handler.java:92)
03-24 01:13:44.374: E/AndroidRuntime(7974):     at android.os.Looper.loop(Looper.java:153)
03-24 01:13:44.374: E/AndroidRuntime(7974):     at android.app.ActivityThread.main(ActivityThread.java:4987)
03-24 01:13:44.374: E/AndroidRuntime(7974):     at java.lang.reflect.Method.invokeNative(Native Method)
03-24 01:13:44.374: E/AndroidRuntime(7974):     at java.lang.reflect.Method.invoke(Method.java:511)
03-24 01:13:44.374: E/AndroidRuntime(7974):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:821)
03-24 01:13:44.374: E/AndroidRuntime(7974):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584)
03-24 01:13:44.374: E/AndroidRuntime(7974):     at dalvik.system.NativeStart.main(Native Method)

谢谢大家。

编辑:

listaddactivity.java 的第 72 行:

myIntent.putExtra(
                    "custom_object",
                    new listControlObject(namefield.getText().toString(),
                            iterator, temperatureFrag.getCurrentTempType(), Integer
                                    .valueOf(powerPercent.getText()
                                            .toString()), Integer
                                    .valueOf(frequencyField.getText()
                                            .toString()),
                            temperatureFrag.temperaturenumberpicker
                                    .getValue(), cycleFrag.startTimeField
                                    .getCurrentHour(),
                            cycleFrag.startTimeField.getCurrentMinute(),
                            cycleFrag.cycleDatePicker.getDayOfMonth(),
                            cycleFrag.cycleDatePicker.getMonth(), Integer
                                    .valueOf(cycleFrag.numberOfCyclesField
                                            .getText().toString())));

上面只是构造了一个新对象,并将其添加到带有“自定义对象”键的意图中。

这里是parcelable对象的代码:

    package com.nanospark.upcdemo;

import android.os.Parcel;
import android.os.Parcelable;

public class listControlObject implements Parcelable {
    private String name;
    private int id;
    private int tempType;// 0 for fahrenheit, 1 for celsius.
    private int powerPercent;
    private int freq;
    private int temp;
    private int cycleDateDay;
    private int cycleDateMonth;
    private int numberOfCycles;
    private int cycleTimeHour;
    private int cycleTimeMinute;

    public listControlObject(String name, int id, int tempType,
            int powerPercent, int freq, int temp, int cycleTimeHour,
            int cycleTimeMinute, int cycleDateDay, int cycleDateMonth,
            int numberOfCycles) {
        this.id = id;
        this.name = name;
        this.cycleDateDay = cycleDateDay;
        this.cycleDateMonth = cycleDateMonth;
        this.cycleTimeHour = cycleTimeHour;
        this.cycleTimeMinute = cycleTimeMinute;
        this.freq = freq;
        this.numberOfCycles = numberOfCycles;
        this.powerPercent = powerPercent;
        this.temp = temp;
        this.tempType = tempType;

    }

    private listControlObject(Parcel in){
        this.id = in.readInt();
        this.name = in.readString();
        this.cycleDateDay = in.readInt();
        this.cycleDateMonth = in.readInt();
        this.cycleTimeHour = in.readInt();
        this.cycleTimeMinute = in.readInt();
        this.freq = in.readInt();
        this.numberOfCycles = in.readInt();
        this.powerPercent = in.readInt();
        this.temp = in.readInt();
        this.tempType = in.readInt();

    }

    public int getCycleDateDay() {
        return cycleDateDay;
    }

    public void setCycleDateDay(int cycleDateDay) {
        this.cycleDateDay = cycleDateDay;
    }

    public int getCycleDateMonth() {
        return cycleDateMonth;
    }

    public void setCycleDateMonth(int cycleDateMonth) {
        this.cycleDateMonth = cycleDateMonth;
    }

    public int getCycleTimeHour() {
        return cycleTimeHour;
    }

    public void setCycleTimeHour(int cycleTimeHour) {
        this.cycleTimeHour = cycleTimeHour;
    }

    public int getCycleTimeMinute() {
        return cycleTimeMinute;
    }

    public void setCycleTimeMinute(int cycleTimeMinute) {
        this.cycleTimeMinute = cycleTimeMinute;
    }

    public int getNumberOfCycles() {
        return numberOfCycles;
    }

    public void setNumberOfCycles(int numberOfCycles) {
        this.numberOfCycles = numberOfCycles;
    }

    public int getTempType() {
        return tempType;
    }

    public void setTempType(int tempType) {
        this.tempType = tempType;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getPowerPercent() {
        return powerPercent;
    }

    public void setPowerPercent(int powerPercent) {
        this.powerPercent = powerPercent;
    }

    public int getFreq() {
        return freq;
    }

    public void setFreq(int freq) {
        this.freq = freq;
    }

    public int getTemp() {
        return temp;
    }

    public void setTemp(int temp) {
        this.temp = temp;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @Override
    public String toString() {

        return this.name;
    }

    @Override
    public int describeContents() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public void writeToParcel(Parcel parcel, int flags) {
        parcel.writeInt(id);
        parcel.writeString(name);
        parcel.writeInt(cycleDateDay);
        parcel.writeInt(cycleDateMonth);
        parcel.writeInt(cycleTimeHour);
        parcel.writeInt(cycleTimeMinute);
        parcel.writeInt(freq);
        parcel.writeInt(numberOfCycles);
        parcel.writeInt(powerPercent);
        parcel.writeInt(temp);
        parcel.writeInt(tempType);

    }
    public static Creator<listControlObject> CREATOR = new Creator<listControlObject>() {
        public listControlObject createFromParcel(Parcel parcel) {
            return new listControlObject(parcel);
        }

        public listControlObject[] newArray(int size) {
            return new listControlObject[size];
        }

    };


}

编辑:

我发现了我的错误来源:

当我需要传递一个listControlObject时,我在这里传递一个包裹。

cyclefragment.a1.add(intent.getParcelableExtra("custom_object"));
            cyclefragment.adapter.notifyDataSetChanged();

如何将intent.getParcelableExtra("custom_object") 转换回listControlObject?

[更新]

新的 Logcat 错误:

    03-24 02:29:46.177: E/AndroidRuntime(9685): FATAL EXCEPTION: main
03-24 02:29:46.177: E/AndroidRuntime(9685): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.nanospark.upcdemo/com.nanospark.upcdemo.MainActivity}: java.lang.NullPointerException
03-24 02:29:46.177: E/AndroidRuntime(9685):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184)
03-24 02:29:46.177: E/AndroidRuntime(9685):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2211)
03-24 02:29:46.177: E/AndroidRuntime(9685):     at android.app.ActivityThread.access$600(ActivityThread.java:149)
03-24 02:29:46.177: E/AndroidRuntime(9685):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1300)
03-24 02:29:46.177: E/AndroidRuntime(9685):     at android.os.Handler.dispatchMessage(Handler.java:99)
03-24 02:29:46.177: E/AndroidRuntime(9685):     at android.os.Looper.loop(Looper.java:153)
03-24 02:29:46.177: E/AndroidRuntime(9685):     at android.app.ActivityThread.main(ActivityThread.java:4987)
03-24 02:29:46.177: E/AndroidRuntime(9685):     at java.lang.reflect.Method.invokeNative(Native Method)
03-24 02:29:46.177: E/AndroidRuntime(9685):     at java.lang.reflect.Method.invoke(Method.java:511)
03-24 02:29:46.177: E/AndroidRuntime(9685):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:821)
03-24 02:29:46.177: E/AndroidRuntime(9685):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584)
03-24 02:29:46.177: E/AndroidRuntime(9685):     at dalvik.system.NativeStart.main(Native Method)
03-24 02:29:46.177: E/AndroidRuntime(9685): Caused by: java.lang.NullPointerException
03-24 02:29:46.177: E/AndroidRuntime(9685):     at com.nanospark.upcdemo.MainActivity.processNewIntent(MainActivity.java:88)
03-24 02:29:46.177: E/AndroidRuntime(9685):     at com.nanospark.upcdemo.MainActivity.onCreate(MainActivity.java:70)
03-24 02:29:46.177: E/AndroidRuntime(9685):     at android.app.Activity.performCreate(Activity.java:5020)
03-24 02:29:46.177: E/AndroidRuntime(9685):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
03-24 02:29:46.177: E/AndroidRuntime(9685):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148)
03-24 02:29:46.177: E/AndroidRuntime(9685):     ... 11 more

相关代码:

@Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        processNewIntent(intent);
    }

    private void processNewIntent(Intent intent) {
        Log.v("TEST", "METHOD CALLED TEST");
        if (intent.hasExtra("custom_object")) {
            if (intent.getParcelableExtra("custom_object")
                    .equals(null)) {
                Log.v("Testing null", "Object is null");
            } else {
                Log.v("Testing null", "Object is not null");
                cyclefragment.a1.add((listControlObject) intent.getParcelableExtra("custom_object"));
                cyclefragment.adapter.notifyDataSetChanged();
            }
        }
    }

logcat 错误指的是这一行:

cyclefragment.a1.add((listControlObject) intent.getParcelableExtra("custom_object"));

我做了

private listControlObject(Parcel in){

public listControlObject(Parcel in){

根据 cmets 的要求。仍然收到错误。

【问题讨论】:

  • listaddactivity.java 的第 72 行是什么?你的 Object 有一个有效的 parcelable 实现吗?
  • 检查我的最新编辑@MarcoAcierno
  • 检查 temperatureFrag 是否为空,然后检查 cycleFrag。如果没有检查编辑文本。无论如何,请使用构建器!您的构造函数使您的代码难以阅读和调试。在线搜索有关 Builder 的教程。

标签: android android-intent nullpointerexception parcelable parcel


【解决方案1】:

您的跟踪文件似乎已损坏或被另一个进程保留。 Logcat上线可能报错:Log.d("LISTACTIVITY", "Intent successfully passed!");

或者您检查活动中的所有namefieldtemperatureFrag ...,以确保在调用发送活动的onClick() 之前它们的实例都已初始化。

因为您在一个代码行中调用了所有实例,所以很难找出错误。试试 DDMS 进行调试!

P/S:你的代码中的第 72 行在哪里?

[更新]

更多详情: Passing a custom Object from one Activity to another Parcelable vs Bundle

如果您已经很好地“包裹”了,在您的目标活动中,只需将收到的对象转换为原始类型,就像您在代码中所做的那样。

您的代码错误是private listControlObject(Parcel in)private。更改为public,以便 Intent 可以使用此构造函数从先前打包的字符串中恢复对象。

【讨论】:

  • 第 72 行是带有对象构造函数的整个 myIntent;是否因为我从未调用 writeToParcel 方法而收到错误?有没有一个例子说明我如何构建一个包裹,然后在我的对象 somwhere 上使用 writeToParcel?
  • 还有;在向您展示代码之前,我会初始化所有片段和字段并输入视图。
  • 你不需要调用writeToParcel(),这是操作系统系统在活动之间传递值时有意调用的。 您必须在 listControlObject 类中实现此方法。因为此函数显示了listControlObject 的元素值保存到内存中然后从这些内存中恢复到可编程变量的方式。 那么你必须检查你调用中使用的所有实例不为空
  • 那么是否会假设我的构造函数中存在调用空值的错误?
  • 当然,您应该使用上面列出的 2 个粗体字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 2019-10-22
  • 1970-01-01
  • 1970-01-01
  • 2014-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多