【问题标题】:NullPointerException for performClick()performClick() 的 NullPointerException
【发布时间】:2016-02-25 08:15:17
【问题描述】:

我正在尝试单击 Fragment 中的按钮。就像在下面的过程中:

  1. 在片段导航抽屉中单击 A
  2. App打开Fragment A
  3. 当 Fragment A 启动时,它在其类中的一个按钮上执行 Click(),这将导致 Activity B

我已经尝试将btnSchedule.performClick(); 放在 OnCreate、OnStart 甚至 AsyncTask onPostExecute 方法中。

然而这一切都会导致如下所示的 nullpointerException:

02-25 16:03:13.421 17348-17348/com.example.l33902.contactmanagment1512 E/AndroidRuntime: 致命异常: main 进程:com.example.l33902.contactmanagment1512,PID:17348 java.lang.NullPointerException:尝试调用虚拟方法 空对象上的“布尔 android.widget.Button.performClick()” 参考 在 com.example.l33902.contactmanagment.FragmentPlanner.onStart(FragmentPlanner.java:106) 在 android.app.Fragment.performStart(Fragment.java:2138) 在 android.app.FragmentManagerImpl.moveToState(FragmentManager.java:937) 在 android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1082) 在 android.app.BackStackRecord.run(BackStackRecord.java:834) 在 android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467) 在 android.app.FragmentManagerImpl$1.run(FragmentManager.java:452) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:145) 在 android.app.ActivityThread.main(ActivityThread.java:6897) 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)

以下是我的代码(片段A)(目前将btnSchedule.performClick();放在onStart方法中):

public class FragmentPlanner extends Fragment {

    View root;
    Context context;
    Button btnSchedule;

    public FragmentPlanner() {
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        final View rootView = inflater.inflate(R.layout.fragment_planner, container, false);
        root = rootView;
        context = rootView.getContext();
        setHasOptionsMenu(true);

        Button btnSchedule = (Button)rootView.findViewById(R.id.btnSchedule);
        btnSchedule.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                // here you set what you want to do when user clicks your button,

                Intent intent = new Intent(getActivity(), CalendarMain.class);
                startActivity(intent);

            }
        });



        return rootView;
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.to_note, menu);
        MenuItem noteItem;
        noteItem = menu.findItem(R.id.action_note).setIcon(resizeImage(R.drawable.ic_note_add_white_24dp, 250, 250));
        noteItem.setVisible(true);

    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if(id == R.id.action_note){
            //Do whatever you want to do

            Intent intent = new Intent(context, CalendarMain.class);
            startActivity(intent);

            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    private Drawable resizeImage(int resId, int w, int h) {
        Bitmap BitmapOrg = BitmapFactory.decodeResource(getResources(), resId);
        int width = BitmapOrg.getWidth();
        int height = BitmapOrg.getHeight();
        int newWidth = w;
        int newHeight = h;
        float scaleWidth = ((float) newWidth) / width;
        float scaleHeight = ((float) newHeight) / height;
        Matrix matrix = new Matrix();
        matrix.postScale(scaleWidth, scaleHeight);
        Bitmap resizedBitmap = Bitmap.createBitmap(BitmapOrg, 0, 0, width, height, matrix, true);
        return new BitmapDrawable(resizedBitmap);
    }

    @Override
    public void onStart(){
        super.onStart();

        btnSchedule.performClick();

        }


}

【问题讨论】:

    标签: java android


    【解决方案1】:

    这一行是错误的:

    Button btnSchedule = (Button)rootView.findViewById(R.id.btnSchedule);
    

    一定是:

    btnSchedule = (Button)rootView.findViewById(R.id.btnSchedule);
    

    因为有会员:

    Button btnSchedule;
    

    当你写作时:

    Button btnSchedule = (Button)rootView.findViewById(R.id.btnSchedule);
    

    你声明了一个局部变量,而不是使用成员变量。

    【讨论】:

      【解决方案2】:

      onCreateView 中,您在本地范围内重新定义成员btnSchedule,隐藏了未初始化的类成员。在 onCreateView 改变

      Button btnSchedule = (Button)rootView.findViewById(R.id.btnSchedule);
      

      btnSchedule = (Button)rootView.findViewById(R.id.btnSchedule);
      

      【讨论】:

        【解决方案3】:

        修改代码如下:

        public class FragmentPlanner extends Fragment {
        
            View rootView;
            Context context;
            Button btnSchedule;
        
            public FragmentPlanner() {
            }
        
            @Override
            public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
        
            }
        
            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                     Bundle savedInstanceState) {
                rootView = inflater.inflate(R.layout.fragment_planner, container, false);
                context = rootView.getContext();
                setHasOptionsMenu(true);
                btnSchedule = (Button)rootView.findViewById(R.id.btnSchedule);
                btnSchedule.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        // here you set what you want to do when user clicks your button,
                        Intent intent = new Intent(getActivity(), CalendarMain.class);
                        startActivity(intent);
                    }
                });
                return rootView;
            }
        

        希望对你有帮助!!!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-10-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多