Android Studio绘图应用程序:不幸的是,应用程序已停止

Android Studio绘图应用程序:不幸的是,应用程序已停止,android,android-fragments,Android,Android Fragments,我的应用程序继续停止,我不知道为什么。这是一个片段中的绘图应用程序,允许用户绘图。我是一个初学者程序员,所以任何帮助都会很好,谢谢 字段片段: package com.example.marlon.fieldapp; import android.app.DialogFragment; import android.content.Context; import android.graphics.Color; import android.media.Image; import android

我的应用程序继续停止,我不知道为什么。这是一个片段中的绘图应用程序,允许用户绘图。我是一个初学者程序员,所以任何帮助都会很好,谢谢

字段片段:

package com.example.marlon.fieldapp;

import android.app.DialogFragment;
import android.content.Context;
import android.graphics.Color;
import android.media.Image;
import android.net.Uri;
import android.os.Bundle;
import android.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import java.util.UUID;
import android.provider.MediaStore;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.view.View.OnClickListener;
import android.widget.Toast;



/**
 * A simple {@link Fragment} subclass.
 * Activities that contain this fragment must implement the
 * {@link Field_fragment.OnFragmentInteractionListener} interface
 * to handle interaction events.
 * Use the {@link Field_fragment#newInstance} factory method to
 * create an instance of this fragment.
 */
public class Field_fragment extends Fragment implements OnClickListener
{
    // TODO: Rename parameter arguments, choose names that match
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";

    // TODO: Rename and change types of parameters
    private String mParam1;
    private String mParam2;

    private DrawingView drawView;
    private ImageButton currPaint, drawBtn;
    private float smallBrush, mediumBrush, largeBrush;

    private OnFragmentInteractionListener mListener;

    public Field_fragment() {
        // Required empty public constructor
    }

    /**
     * Use this factory method to create a new instance of
     * this fragment using the provided parameters.
     *
     * @param param1 Parameter 1.
     * @param param2 Parameter 2.
     * @return A new instance of fragment Field_fragment.
     */
    // TODO: Rename and change types and number of parameters
    public static Field_fragment newInstance(String param1, String param2)
    {
        Field_fragment fragment = new Field_fragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        smallBrush = getResources().getInteger(R.integer.small_size);
        mediumBrush = getResources().getInteger(R.integer.medium_size);
        largeBrush = getResources().getInteger(R.integer.large_size);

        drawBtn = (ImageButton)getView().findViewById(R.id.draw_btn);
        drawBtn.setOnClickListener(this);

        drawView.setBrushSize(mediumBrush);

        super.onCreate(savedInstanceState);
        if (getArguments() != null)
        {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }

    }



    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState)
    {
        // Inflate the layout for this fragment
        drawView = (DrawingView) drawView.findViewById(R.id.drawing);
        LinearLayout paintLayout = (LinearLayout) getView().findViewById(R.id.paint_colours);
        currPaint = (ImageButton)paintLayout.getChildAt(0);
        currPaint.setImageDrawable(getResources().getDrawable(R.drawable.paint_pressed));

        return getView();
    }

    // TODO: Rename method, update argument and hook method into UI event
    public void onButtonPressed(Uri uri) {
        if (mListener != null) {
            mListener.onFragmentInteraction(uri);
        }
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if (context instanceof OnFragmentInteractionListener) {
            mListener = (OnFragmentInteractionListener) context;
        } else {
            throw new RuntimeException(context.toString()
                    + " must implement OnFragmentInteractionListener");
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mListener = null;
    }

    /**
     * This interface must be implemented by activities that contain this
     * fragment to allow an interaction in this fragment to be communicated
     * to the activity and potentially other fragments contained in that
     * activity.
     * <p/>
     * See the Android Training lesson <a href=
     * "http://developer.android.com/training/basics/fragments/communicating.html"
     * >Communicating with Other Fragments</a> for more information.
     */

    public void paintClicked(View view)
    {
        if(view!=currPaint)
        {
            ImageButton imgView = (ImageButton)view;
            String color = view.getTag().toString();
            drawView.setColor(color);
        }
    }

    @Override
    public void onClick(View view)
    { //Respond to clicks
        if(view.getId()==R.id.draw_btn)
        {
            final Dialog brushDialog;
            brushDialog = new Dialog(getActivity());
            brushDialog.setTitle("Brush size:");

            brushDialog.setContentView(R.layout.brush_chooser);

            ImageButton smallBtn = (ImageButton)brushDialog.findViewById(R.id.small_brush);
            smallBtn.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    drawView.setBrushSize(smallBrush);
                    drawView.setLastBrushSize(smallBrush);
                    brushDialog.dismiss();
                }
            });

            ImageButton mediumBtn = (ImageButton)brushDialog.findViewById(R.id.medium_brush);
            mediumBtn.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    drawView.setBrushSize(mediumBrush);
                    drawView.setLastBrushSize(mediumBrush);
                    brushDialog.dismiss();
                }
            });

            ImageButton largeBtn = (ImageButton)brushDialog.findViewById(R.id.large_brush);
            largeBtn.setOnClickListener(new OnClickListener(){
                @Override
                public void onClick(View v) {
                    drawView.setBrushSize(largeBrush);
                    drawView.setLastBrushSize(largeBrush);
                    brushDialog.dismiss();
                }
            });
            brushDialog.show();
        }
    }

    public interface OnFragmentInteractionListener
    {
        // TODO: Update argument type and name
        void onFragmentInteraction(Uri uri);
    }
}

在onCreateView中,应返回膨胀视图

获取片段布局的根视图(由 onCreateView(LayoutFlater、ViewGroup、Bundle)(如果提供)

听你的评论

// Inflate the layout for this fragment
使用提供的充气工具为布局资源充气。 差不多

View fragmentView =  inflater.inflate(R.layout.frag_view, container, false);
返回
片段视图

你可能也应该搬家

        drawBtn = (ImageButton)getView().findViewById(R.id.draw_btn);

在通货膨胀之后重新创建视图。同样,使用膨胀视图,而不是getView()。

在片段中,您不应该访问ui元素ion oncreate方法。您必须在oncreateView方法中执行此操作,请尝试以下代码

package com.example.marlon.fieldapp;

        import android.app.DialogFragment;
        import android.content.Context;
        import android.graphics.Color;
        import android.media.Image;
        import android.net.Uri;
        import android.os.Bundle;
        import android.app.Fragment;
        import android.view.LayoutInflater;
        import android.view.View;
        import android.view.ViewGroup;
        import android.widget.ImageButton;
        import android.widget.LinearLayout;
        import java.util.UUID;
        import android.provider.MediaStore;
        import android.app.AlertDialog;
        import android.app.Dialog;
        import android.content.DialogInterface;
        import android.view.View.OnClickListener;
        import android.widget.Toast;



        /**
         * A simple {@link Fragment} subclass.
         * Activities that contain this fragment must implement the
         * {@link Field_fragment.OnFragmentInteractionListener} interface
         * to handle interaction events.
         * Use the {@link Field_fragment#newInstance} factory method to
         * create an instance of this fragment.
         */
        public class Field_fragment extends Fragment implements OnClickListener
        {
            // TODO: Rename parameter arguments, choose names that match
            // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
            private static final String ARG_PARAM1 = "param1";
            private static final String ARG_PARAM2 = "param2";

            // TODO: Rename and change types of parameters
            private String mParam1;
            private String mParam2;

            private DrawingView drawView;
            private ImageButton currPaint, drawBtn;
            private float smallBrush, mediumBrush, largeBrush;

            private OnFragmentInteractionListener mListener;

            public Field_fragment() {
                // Required empty public constructor
            }

            /**
             * Use this factory method to create a new instance of
             * this fragment using the provided parameters.
             *
             * @param param1 Parameter 1.
             * @param param2 Parameter 2.
             * @return A new instance of fragment Field_fragment.
             */
            // TODO: Rename and change types and number of parameters
            public static Field_fragment newInstance(String param1, String param2)
            {
                Field_fragment fragment = new Field_fragment();
                Bundle args = new Bundle();
                args.putString(ARG_PARAM1, param1);
                args.putString(ARG_PARAM2, param2);
                fragment.setArguments(args);
                return fragment;
            }

            @Override
            public void onCreate(Bundle savedInstanceState)
            {


                super.onCreate(savedInstanceState);
                if (getArguments() != null)
                {
                    mParam1 = getArguments().getString(ARG_PARAM1);
                    mParam2 = getArguments().getString(ARG_PARAM2);
                }

            }



            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                     Bundle savedInstanceState)
            {
                // Inflate the layout for this fragment
                drawView = (DrawingView) drawView.findViewById(R.id.drawing);
                LinearLayout paintLayout = (LinearLayout) getView().findViewById(R.id.paint_colours);
                currPaint = (ImageButton)paintLayout.getChildAt(0);
                currPaint.setImageDrawable(getResources().getDrawable(R.drawable.paint_pressed));

                smallBrush = getResources().getInteger(R.integer.small_size);
                mediumBrush = getResources().getInteger(R.integer.medium_size);
                largeBrush = getResources().getInteger(R.integer.large_size);

                drawBtn = (ImageButton)getView().findViewById(R.id.draw_btn);
                drawBtn.setOnClickListener(this);

                drawView.setBrushSize(mediumBrush);

                return getView();
            }

            // TODO: Rename method, update argument and hook method into UI event
            public void onButtonPressed(Uri uri) {
                if (mListener != null) {
                    mListener.onFragmentInteraction(uri);
                }
            }

            @Override
            public void onAttach(Context context) {
                super.onAttach(context);
                if (context instanceof OnFragmentInteractionListener) {
                    mListener = (OnFragmentInteractionListener) context;
                } else {
                    throw new RuntimeException(context.toString()
                            + " must implement OnFragmentInteractionListener");
                }
            }

            @Override
            public void onDetach() {
                super.onDetach();
                mListener = null;
            }

            /**
             * This interface must be implemented by activities that contain this
             * fragment to allow an interaction in this fragment to be communicated
             * to the activity and potentially other fragments contained in that
             * activity.
             * <p/>
             * See the Android Training lesson <a href=
             * "http://developer.android.com/training/basics/fragments/communicating.html"
             * >Communicating with Other Fragments</a> for more information.
             */

            public void paintClicked(View view)
            {
                if(view!=currPaint)
                {
                    ImageButton imgView = (ImageButton)view;
                    String color = view.getTag().toString();
                    drawView.setColor(color);
                }
            }

            @Override
            public void onClick(View view)
            { //Respond to clicks
                if(view.getId()==R.id.draw_btn)
                {
                    final Dialog brushDialog;
                    brushDialog = new Dialog(getActivity());
                    brushDialog.setTitle("Brush size:");

                    brushDialog.setContentView(R.layout.brush_chooser);

                    ImageButton smallBtn = (ImageButton)brushDialog.findViewById(R.id.small_brush);
                    smallBtn.setOnClickListener(new OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            drawView.setBrushSize(smallBrush);
                            drawView.setLastBrushSize(smallBrush);
                            brushDialog.dismiss();
                        }
                    });

                    ImageButton mediumBtn = (ImageButton)brushDialog.findViewById(R.id.medium_brush);
                    mediumBtn.setOnClickListener(new OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            drawView.setBrushSize(mediumBrush);
                            drawView.setLastBrushSize(mediumBrush);
                            brushDialog.dismiss();
                        }
                    });

                    ImageButton largeBtn = (ImageButton)brushDialog.findViewById(R.id.large_brush);
                    largeBtn.setOnClickListener(new OnClickListener(){
                        @Override
                        public void onClick(View v) {
                            drawView.setBrushSize(largeBrush);
                            drawView.setLastBrushSize(largeBrush);
                            brushDialog.dismiss();
                        }
                    });
                    brushDialog.show();
                }
            }

            public interface OnFragmentInteractionListener
            {
                // TODO: Update argument type and name
                void onFragmentInteraction(Uri uri);
            }
        }
在oncreateview中初始化之前

drawView = (DrawingView) drawView.findViewById(R.id.drawing);

从该错误:NullPointerException:尝试调用虚拟方法“android.view.view android.view.view.findviewbyd(int)”,似乎找不到具有findviewbyd的视图。我看不出在哪里扩展布局文件,通常是这样一行:setContentView(R.layout.activity_main);现在我在第99行遇到了一个错误,我不太确定为什么。我在那里也使用了getFragment():drawBtn=(ImageButton)getView().findviewbyd(R.id.draw\u btn);下面是错误说明:由com.example.marlon.fieldapp.Field_fragment.onCreate(Field_fragment.java:99)@MarlonPalmer Avoid getView()引起的:java.lang.NullPointerException,使用膨胀的视图并获取R.id.draw_btn按钮。如果您需要,请将其作为会员。这也是一个新问题。
drawView.setBrushSize(mediumBrush);
drawView = (DrawingView) drawView.findViewById(R.id.drawing);