java - 恢复应用程序时尝试写入空对象引用上的字段 'int android.app.Fragment.mNextAnim'

标签 java android

我有一个从 Firebase 获取数据的列表 Activity ,我有取消选中所有复选框的菜单项。第一次进入 Activity 时它工作正常,但是当我从此 Activity 退出应用程序并且当我返回应用程序时应用程序进入休眠状态时,我得到

Exception java.lang.NullPointerException: Attempt to write to field 'int android.app.Fragment.mNextAnim' on a null object reference android.app.BackStackRecord.run (BackStackRecord.java:779) android.app.FragmentManagerImpl.execPendingActions (FragmentManager.java:1582) android.app.FragmentManagerImpl$1.run (FragmentManager.java:483) android.os.Handler.handleCallback (Handler.java:751) android.os.Handler.dispatchMessage (Handler.java:95) android.os.Looper.loop (Looper.java:154) android.app.ActivityThread.main (ActivityThread.java:6688) java.lang.reflect.Method.invoke (Method.java) com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1468) com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1358)

我试图理解为什么我得到 null 但没有成功,我调试了我的应用程序,问题出在函数 setIconPercent()

我的 Activity :

package com.nadav.weddingcalc.activity_best_list;
import android.content.Context;
import android.content.res.TypedArray;
import android.os.Handler;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.app.NavUtils;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.Toast;

import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.AdView;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;


import com.joanfuentes.hintcase.HintCase;
import com.joanfuentes.hintcase.RectangularShape;
import com.joanfuentes.hintcaseassets.hintcontentholders.SimpleHintContentHolder;
import com.joanfuentes.hintcaseassets.shapeanimators.RevealRectangularShapeAnimator;
import com.joanfuentes.hintcaseassets.shapeanimators.UnrevealRectangularShapeAnimator;
import com.nadav.weddingcalc.R;
import com.squareup.picasso.Picasso;

public class ActivityBest extends AppCompatActivity {
    static ListView lv;
    private AdapterActivityBest adapterActivityBest;
    DatabaseReference mDatabase;
    FirebaseUser user;
    static private FirebaseAuth auth;
    DatabaseReference myRef;
    static AdView mAdView;
    public  String numOfRows;
    MenuItem it;
    Menu men;

     @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_activity_place);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        final ProgressBar pBar = (ProgressBar) findViewById(R.id.progresbar);
        mAdView = (AdView) findViewById(R.id.adView);
        AdRequest adRequest = new AdRequest.Builder().
                addTestDevice(getString(R.string.ad_test_device_nexus5x))
                .addTestDevice("0E9830DF43C4EB440157B8C079727CF9")
                .build();
        mAdView.loadAd(adRequest);

        auth = FirebaseAuth.getInstance();
        mDatabase = FirebaseDatabase.getInstance().getReference();
        user = auth.getCurrentUser();
        lv = (ListView) findViewById(R.id.lv);
        adapterActivityBest = new AdapterActivityBest(getApplicationContext()  ,lv, this);
         FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
         fab.setVisibility(View.INVISIBLE);

        lv.setAdapter(adapterActivityBest);


        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {

                FirebaseDatabase database = FirebaseDatabase.getInstance();
                FirebaseUser user = auth.getCurrentUser();
                myRef = database.getReference("users");
                myRef.child(user.getUid()).child("list Best").orderByChild("orderNum").addValueEventListener(new ValueEventListener() {

                    @Override
                    public void onDataChange(DataSnapshot snapshot) {
                        adapterActivityBest.removeAllll();
                        adapterActivityBest.notifyDataSetChanged();

                        if (!snapshot.hasChildren()) {

                            auth = FirebaseAuth.getInstance();
                            mDatabase = FirebaseDatabase.getInstance().getReference();
                            FirebaseUser user = auth.getCurrentUser();

                            String[] temp = getResources().getStringArray(R.array.Best_list);

                            int[] arrDividers = {0,5,10,18,24,31,37,46};
                            int[] arrSectors = {1,4,6,7,8,9,11,12,13,14,15,17,19,23,25,27,29,39,43,49,50,51,52};

                            for(int i=0; i<=55 ; i++){
                                boolean flag = false;
                                for(int j=0; j<=22; j++) {
                                    if (i == arrSectors[j]) {
                                        ObjectActivityBest ob = new ObjectActivityBest("false", temp[i], i, "sector");
                                        mDatabase.child("users").child(user.getUid()).child("list Best").child(ob.name+"").setValue(ob);
                                        flag = true;
                                    }
                                }
                                for(int j=0; j<=7; j++) {
                                    if (i == arrDividers[j]) {
                                        ObjectActivityBest ob = new ObjectActivityBest("false", temp[i], i, "divider");
                                        mDatabase.child("users").child(user.getUid()).child("list Best").child(ob.name+"").setValue(ob);
                                        flag = true;
                                    }
                                }
                                if(!flag){
                                ObjectActivityBest ob = new ObjectActivityBest("false", temp[i], (i), "item");
                                    mDatabase.child("users").child(user.getUid()).child("list Best").child(ob.name+"").setValue(ob);
                                }
                            }


                        } else {

                            int countchecks=0;
                            FirebaseDatabase database = FirebaseDatabase.getInstance();
                            FirebaseUser user = auth.getCurrentUser();
                            myRef = database.getReference("users");
                            for (DataSnapshot messageSnapshot : snapshot.getChildren()) {

                                String name = (String) messageSnapshot.child("name").getValue();
                                String check = (String) messageSnapshot.child("check").getValue();
                                int orderNum = ((Long) messageSnapshot.child("orderNum").getValue()).intValue();
                                String sector = (String) messageSnapshot.child("sector").getValue();


                                    ObjectActivityBest e = new ObjectActivityBest(check, name, orderNum, sector);
                                switch(e.sector){
                                    case "sector":
                                        switch(e.name){
                                            case "צלם":
                                                e.name = "בחירת צלם";
                                                mDatabase.child("users").child(user.getUid()).child("list Best").child(e.orderNum+"").setValue(e);
                                                break;
                                            case "קייטרינג":
                                                e.name = "בחירת קייטרינג";
                                                mDatabase.child("users").child(user.getUid()).child("list Best").child(e.orderNum+"").setValue(e);
                                                break;
                                            case "דיגיי":
                                                e.name = "בחירת תקליטן";
                                                mDatabase.child("users").child(user.getUid()).child("list Best").child(e.orderNum+"").setValue(e);
                                                break;
                                        }
                                        adapterActivityBest.addSectionHeaderItem(e);
                                        break;
                                    case "divider":
                                        adapterActivityBest.addDividerHeaderItem(e);
                                        break;
                                    default:
                                        adapterActivityBest.addItem(e);
                                        break;
                                }
                                if(e.check.equals("true")){
                                    if(e.name.equals("בחירת אולם")){
                                        countchecks= countchecks+20;
                                    }else{
                                        if((e.orderNum>0&&e.orderNum<=9)){
                                            countchecks+=5;
                                        }else if(e.orderNum>=11 && e.orderNum<=15){
                                            countchecks+=2;
                                        }else{
                                            countchecks++;

                                        }
                                    }
                                }
                            }

                            setIconPercent(countchecks);



                        }

                        pBar.setVisibility(View.INVISIBLE);

                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {
                    }
                });
//                launchAutomaticHint();
            }
        }, 0);

    }

    private void setIconPercent(int countchecks) {

    TypedArray imgs = getResources().obtainTypedArray(R.array.random_imgs);

    it = men.findItem(R.id.action_check);

    it.setIcon(ContextCompat.getDrawable(getApplicationContext(),  imgs.getResourceId(countchecks/5, -1)));
    imgs.recycle();
    if(countchecks%5==0){
        it = men.findItem(R.id.action_text);
        it.setVisible(false);
        it = men.findItem(R.id.action_check);
        it.setVisible(true);
    }else{
        it = men.findItem(R.id.action_check);
        it.setVisible(false);
        it = men.findItem(R.id.action_text);
        it.setVisible(true);
        it.setTitle(countchecks+"%");
    }




    }


    public void makeTextLong(String s){
        Context context = getApplicationContext();
        Toast.makeText(context,s,Toast.LENGTH_LONG).show();
    }

    public Menu getMen() {
        return men;
    }

    public MenuItem getIt() {
        return it;
    }

    public String getNumOfRows() {
        return numOfRows;
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        // If the nav drawer is open, hide action items related to the content view
        getMenuInflater().inflate(R.menu.percentage_menu, menu);
        men = menu;

        return super.onPrepareOptionsMenu(menu);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(com.nadav.weddingcalc.R.menu.percentage_menu, menu);
        men = menu;
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        android.app.Fragment fragment = null;
        //noinspection SimplifiableIfStatement
        switch (id) {
            case android.R.id.home:
                NavUtils.navigateUpFromSameTask(this);
//                try{
//                    this.finish();
//                }catch(Exception e){
//                    makeTextLong("crash");
//                }
                return true;

            default:
                return super.onOptionsItemSelected(item);

        }

    }
}

最佳答案

您得到这个空指针是因为您没有为 fragment 维护堆栈。 当您恢复 Activity 时, fragment 的实例会被破坏并且不会重新初始化。 所以需要维护fragment stack并检查fragment stack是否为null

关于java - 恢复应用程序时尝试写入空对象引用上的字段 'int android.app.Fragment.mNextAnim',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42581127/

相关文章:

java - 使用自定义逻辑声明公共(public)静态变量

android - Android 上的实时通话转录

java - 单例设计模式中的 Synchronized(MyClass.class){ } - 它有什么作用?

java - 简单的跨平台 GUI 应用程序

ARMv7 上的 Java (JVM)(更具体地说是 Cubox 或 BeagleBoard)?

java - 如何返回整个 JSONObject?

java - 单击按钮后如何将Paypal集成到付款用户?

android - 在 Android 中使用 NanoHTTPD

java - Web 服务 + Soap + Android

java - DispatcherServlet - Roo 项目中的上下文初始化失败