사용자 지정 대화 상자의findViewByID로 null 반환

15844 단어 Android
사용자 정의 대화상자를 만들려고 했는데 오른쪽 상단에 있는 '기록 시작' 을 누르자 이 대화상자가 나타나기 전에 떨어졌습니다.

다른 사람도 썼을지도 모르지만, 나는 쓸 테니, 잊지 마라.
writeLog () 이 메서드는 사용자 지정 대화 상자를 사용합니다.
MainActivity.java
import android.content.DialogInterface;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;


public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button resetLogButton;
    private Button writeLogButton;
    private TextView logTextView;

    private int counter = 0;
    private String log = "";

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

        resetLogButton = (Button) findViewById(R.id.resetLogButton);
        writeLogButton = (Button) findViewById(R.id.writeLogButton);
        logTextView = (TextView) findViewById(R.id.logTextView);
        resetLogButton.setOnClickListener(this);
        writeLogButton.setOnClickListener(this);

        for (int i = 0; i < 100; i++) {
            addLog("Log Message " + i);
        }
    }

    public void addLog(String str) {
        log += counter + " " + str + "\n";
        logTextView.setText(log);
        counter++;
    }

    @Override
    public void onClick(View v) {
        if (v == resetLogButton) {
            counter = 0;
            log = "";
            logTextView.setText(log);
        } else if (v == writeLogButton) {
            writeLog();
        }
    }

    private void writeLog() {
        LayoutInflater inflater = (LayoutInflater) this.getSystemService(LAYOUT_INFLATER_SERVICE);
        final View dialogLayout = inflater.inflate(R.layout.write_log_dialog, (ViewGroup) findViewById(R.id.layout_root));
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("書き出すログを指定");
        //builder.setMessage("");
        builder.setView(dialogLayout);
        builder.setPositiveButton("書き出し", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                RadioGroup radioGroup = (RadioGroup) dialogLayout.findViewById(R.id.writeLogRadioGroup);
                if (radioGroup.getCheckedRadioButtonId() == R.id.applicationLogRadioButton) {
                    //write applicationLog
                    Log.i("dialog","application log");
                } else {
                    //write systemLog
                    Log.i("dialog","system log");
                }
            }
        });

        builder.setNegativeButton("キャンセル", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                    }
                }
        );

        builder.create().show();
    }
}
다음은 사용자 정의 대화상자의 배치입니다.
write_log_dialog.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layout_root"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="10dp">

    <RadioGroup
        android:id="@+id/writeLogRadioGroup"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <RadioButton
            android:id="@+id/applicationLogRadioButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:checked="true"
            android:text="アプリケーションのログ" />

        <RadioButton
            android:id="@+id/systemLogRadioButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:checked="false"
            android:text="システムログ" />
    </RadioGroup>
</LinearLayout>
떨어진 이유는요.
RadioGroup radioGroup = (RadioGroup) dialogLayout.findViewById(R.id.writeLogRadioGroup);
열다
RadioGroup radioGroup = (RadioGroup) findViewById(R.id.writeLogRadioGroup);
이렇게 썼어요.
또한 MainActivity와 사용자 정의 대화상자가 두 개의 레이아웃을 조작했기 때문에 어느 뷰에 속하는지 명확하게 표시하지 않았기 때문에 null을 찾지 못하고 되돌아왔습니다.
추기:
지적해 주셔서 감사합니다.
잘 이해하고 싶은 사람은 Nkzn의 댓글을 보세요.

좋은 웹페이지 즐겨찾기