마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

다이얼로그프래그먼트 를 메뉴에서 띄우려고 합니다.

0 추천

메인화면 툴바에 옵션 "경보기기능" 을 눌렀을 때 Dialogfragment 에서 만든 alertdialog를 띄우게 하려고 합니다. 메인엑티비티의 onCreate()에

// action_settings1 = 경보기 기능 id

findViewById(R.id.action_settings1).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        PasswordConfirmDialogFragment passwordConfirmDialogFragment = new PasswordConfirmDialogFragment();
        passwordConfirmDialogFragment.show(getSupportFragmentManager(), "dialog");

    }

});

를 넣고 실행했는데 

    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.testsmes/com.example.testsmes.activity.tap.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3270)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
        at com.example.testsmes.activity.tap.MainActivity.onCreate(MainActivity.java:81)

이런식으로 에러가 뜨고 앱은 메인화면조차도 안뜨고 "keeps stopping"이 뜹니다. 다시 위에 추가한 걸 빼면 잘 실행됩니다. 어떻게 해야 dialogfragment 에서 만든 alertdialog를 띄울수 있을까요? dialogframent는 오류 없습니다.

smes (120 포인트) 님이 2020년 7월 28일 질문
다이얼로그프래그먼트 입니다.

public class PasswordConfirmDialogFragment extends DialogFragment {

    private static final String EXTRA_PASSWORD = "extra_password";
    private static final String EXTRA_VIEW_PAGER_ID = "extra_view_pager_id";

    private String password;
    private int viewPagerId;

    private EditText passwordInput;

    public PasswordConfirmDialogFragment newInstance(String password, int viewPagerId) {
        Bundle bundle = new Bundle();
        bundle.putString(EXTRA_PASSWORD, password);
        bundle.putInt(EXTRA_VIEW_PAGER_ID, viewPagerId);

        PasswordConfirmDialogFragment passwordConfirmDialogFragment = new PasswordConfirmDialogFragment();
        passwordConfirmDialogFragment.setArguments(bundle);
        passwordConfirmDialogFragment.show(getActivity().getSupportFragmentManager(), "tag");
        return passwordConfirmDialogFragment;
    }



    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            password = getArguments().getString(EXTRA_PASSWORD);
            viewPagerId = getArguments().getInt(EXTRA_VIEW_PAGER_ID);
        }
    }

    public Dialog onCreateDialog(Bundle savedInstanceState) {

        LayoutInflater li = getActivity().getLayoutInflater();
        View view = li.inflate(R.layout.test_activity, null);

        final AlertDialog.Builder alert = new AlertDialog.Builder(getActivity());
        final EditText passwordInput = view.findViewById(R.id.password_confrim);

        alert.setView(view);
        alert.setTitle(R.string.sync_password);
        if(password.equals("")) {
            new NewSemsFunctionDialogFragment().show(getFragmentManager(), "newSemsFunctionMenu");
            return null;
        } else {
            alert.setTitle("비빌번호를 입력하세요 : " + password);
        alert.setPositiveButton(R.string.confirm,
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                        if (password.equals(R.id.password_textview)) {
                            InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
                            imm.hideSoftInputFromWindow(passwordInput.getWindowToken(), 0);
                            //필수 : 기계의 기능을 수행하는 다이얼로그를 띄운다. 뷰페이저의 id를 참조하여 알맞는 기계의 기능 다이얼로그를 띄운다.
                            switch (viewPagerId) {
                                default:
                                    new NewSemsFunctionDialogFragment().show(getFragmentManager(), "newSemsFunctionMenu");
                                    break;
                            }
                        } else {
                            Log.i("utsnap", "비빌번호 틀림");
                            Toast.makeText(getActivity(), "비밀번호가 틀렸습니다.", Toast.LENGTH_SHORT);
                        }
                    }
                });
        alert.setNegativeButton(R.string.cancel, null);
        AlertDialog dialog = alert.create();


        dialog.getWindow().setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        alert.show();
        return dialog;

    }
    }





}

2개의 답변

0 추천

메뉴를 선택했을 때는 

public boolean onOptionsItemSelected(MenuItem item) 

가 호출 되는데 이 부분 확인해보세요

옛날꿀호떡 (390 포인트) 님이 2020년 7월 28일 답변
public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()) {
            case R.id.appSettingMenuItem:
                Intent intent = new Intent(this, SettingsActivity.class);
                startActivity(intent);
                break;
                ///완료

            }

        return super.onOptionsItemSelected(item);
    }

툴바에 메뉴가 두개인데 하나는 이렇게 설정해놨습니다.
public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()) {
            case R.id.appSettingMenuItem:
                Intent intent = new Intent(this, SettingsActivity.class);
                startActivity(intent);
                break;
                ///완료

             case R.id.action_settings1:
                 break;

            }

        return super.onOptionsItemSelected(item);
    }

이런식으로 해보세요~
이렇게했는데 안뜨네요 ㅠㅠ
0 추천
'void android.view.View.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
  at com.example.testsmes.activity.tap.MainActivity.onCreate(MainActivity.java:81)

 

MainActivity 81라인에서 null인 뷰에 onClickListener를 달았다고 나오네요. 

쎄미 (162,410 포인트) 님이 2020년 7월 28일 답변
81라인이 제가 넣으려고 하는 부분인데 잘못됬나 보네요
메뉴 버튼 이벤트는 어떻게 넣어줘야 하는건가요?
81라인의 코드가 어떻게 됐는지부터 본문에 추가하세요. 그래야 누군가 보고 답을 달아주죠.
...