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

안드로이드 스튜디오 초보입니다. 체크박스 버튼이벤트로 결과값을 도출하는법 좀 알려주세요

0 추천
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    tools:ignore="ExtraText">
    android:stateListAnimator="@null"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textview1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#009688"
        android:gravity="center_horizontal"
        android:text="@string/TextView"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textColor="@color/white"
        android:textSize="75sp"
        tools:ignore="MissingConstraints"
        tools:layout_editor_absoluteX="-16dp"
        tools:layout_editor_absoluteY="32dp" />

    <TableLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center">

        <TableRow tools:ignore="UselessParent">

            <CheckBox
                android:id="@+id/checkBox1"
                android:layout_width="126dp"
                android:layout_height="111dp"
                android:checked="false"
                android:gravity="center_horizontal|center_vertical"
                android:text="@string/checkBox1"
                android:textSize="34sp"
                tools:ignore="MissingConstraints"
                tools:layout_editor_absoluteX="595dp"
                tools:layout_editor_absoluteY="145dp" />

            <CheckBox
                android:id="@+id/checkbox2"
                android:layout_width="126dp"
                android:layout_height="105dp"
                android:checked="false"
                android:gravity="center_horizontal|center_vertical"
                android:text="@string/checkbox2"
                android:textSize="34sp"
                tools:ignore="MissingConstraints"
                tools:layout_editor_absoluteX="593dp"
                tools:layout_editor_absoluteY="279dp" />

            <CheckBox
                android:id="@+id/checkbox3"
                android:layout_width="126dp"
                android:layout_height="107dp"
                android:checked="false"
                android:gravity="center_horizontal|center_vertical"
                android:text="@string/checkbox3"
                android:textSize="34sp"
                tools:ignore="MissingConstraints"
                tools:layout_editor_absoluteX="595dp"
                tools:layout_editor_absoluteY="418dp" />
        </TableRow>
    </TableLayout>

    <Button
        android:id="@+id/button1"
        android:layout_width="match_parent"
        android:layout_height="86dp"
        android:backgroundTint="@android:color/darker_gray"
        android:text="@string/button1"
        android:textSize="34sp"
        tools:ignore="MissingConstraints"
        tools:layout_editor_absoluteX="547dp"
        tools:layout_editor_absoluteY="558dp" />

    <TextView
        android:id="@+id/textview"
        android:layout_width="match_parent"
        android:layout_height="108dp"
        android:background="@drawable/textbox"
        android:gravity="center_horizontal|center_vertical"
        android:text="@string/textview"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textSize="48sp"
        tools:ignore="MissingConstraints"
        tools:layout_editor_absoluteX="282dp"
        tools:layout_editor_absoluteY="666dp" />

</LinearLayout>

 

위는 질문하고자 하는 내용의 XML로, checkbox.xml 입니다.

 

package com.example.a20151544;

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.TextView;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

public class checkbox extends AppCompatActivity {


    @SuppressLint("SetTextI18n")
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.checkbox);


        final CheckBox cb1 = findViewById(R.id.checkBox1);
        final CheckBox cb2 = findViewById(R.id.checkBox2);
        final CheckBox cb3 = findViewById(R.id.checkBox3);
        final Button b = findViewById(R.id.button1);
        final TextView tv = findViewById(R.id.textView2);


        b.setOnClickListener(v -> {
            String result = "";
            if(cb1.isChecked()) result += cb1.getText().toString();
            if(cb2.isChecked()) result += cb2.getText().toString();
            if(cb3.isChecked()) result += cb3.getText().toString();
            tv.setText("선택결과:" + result);

        });
    }
}

 

위는 chekbox.xml의 자바 코드로서 Activity_main에서 버튼클릭 후 화면전환으로 넘어온 페이지 입니다.

이를 실행해보면 다음과 같이 나옵니다.

 

 

실행 결과 페이지 입니다

여기서 체크박스에 체크한뒤 선택완료 버튼을 누르면 선택결과창에 값이 표시되어야 하는데,

표시가 되지않고 다음과 같이 화면전환 전 화면으로 되돌아갑니다.

 

 

그리고 다시 체크박스 이벤트를 진행하면

 

 

이렇게 강제종료가 됩니다..

 

실행기기는 10.1 WXGA(Tablet) API 30 으로, 안드로이드 스튜디오는 최신 버전 입니다.

 

 

저것을 해결하고 체크 박스 체크 후 선택 완료 버튼을 눌러 선택 결과 창에 재실, 퇴실, 회의가 표시되려면 어떻게 고쳐야 될까요?

이제 시작해보는 초보입니다. 몇 일 동안 여기저기서 알아보고 수정하려고 해도 도저히 알 수가 없어서 질문드립니다..

 

체크박스 화면전환 전 코드도 필요하다면 올리겠습니다. 

 

 

chs943 (120 포인트) 님이 2021년 10월 7일 질문
chs943님이 2021년 10월 7일 수정
코드 자체가 이상해 보이지는 않는데,  화면전환시에 앱 크래시가 나고 있는 것 같기도 하고...
"
여기서 체크박스에 체크한뒤 선택완료 버튼을 누르면 선택결과창에 값이 표시되어야 하는데,
표시가 되지않고 다음과 같이 화면전환 전 화면으로 되돌아갑니다.
" ->  이 부분에서 앱크래시나 이상한 증상이 발생하는 것 같아 보이네요.
체크박스 화면전환 코드도 올려보시겠어요?
<화면전환전 xml>

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:stateListAnimator="@null"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView3"
        android:layout_width="219dp"
        android:layout_height="79dp"
        android:layout_marginStart="360dp"
        android:layout_marginTop="104dp"
        android:background="@drawable/textbox"
        android:gravity="center_horizontal"
        android:text="@string/TextView3"
        android:textSize="60sp"
        android:textStyle="bold"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/textView4"
        android:layout_width="219dp"
        android:layout_height="79dp"
        android:layout_marginStart="360dp"
        android:layout_marginTop="56dp"
        android:background="@drawable/textbox"
        android:gravity="center_horizontal"
        android:text="@string/textView4"
        android:textSize="60sp"
        android:textStyle="bold"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView3" />

    <EditText
        android:id="@+id/editTextTextPersonName"
        android:layout_width="316dp"
        android:layout_height="74dp"
        android:layout_marginStart="52dp"
        android:layout_marginTop="104dp"
        android:background="@drawable/textbox"
        android:ems="10"
        android:importantForAutofill="no"
        android:inputType="textPersonName"
        app:layout_constraintStart_toEndOf="@+id/textView3"
        app:layout_constraintTop_toTopOf="parent"
        tools:ignore="LabelFor" />

    <EditText
        android:id="@+id/editTextTextPersonName2"
        android:layout_width="316dp"
        android:layout_height="74dp"
        android:layout_marginStart="52dp"
        android:layout_marginTop="68dp"
        android:background="@drawable/textbox"
        android:ems="10"
        android:importantForAutofill="no"
        android:inputType="textPersonName"
        app:layout_constraintStart_toEndOf="@+id/textView4"
        app:layout_constraintTop_toBottomOf="@+id/editTextTextPersonName"
        tools:ignore="LabelFor" />

    <Button
        android:id="@+id/button"
        android:layout_width="479dp"
        android:layout_height="304dp"
        android:layout_marginBottom="68dp"
        android:backgroundTint="@android:color/darker_gray"
        android:stateListAnimator="@null"
        android:text="@string/재실상태"
        android:textSize="96sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.486"
        app:layout_constraintStart_toStartOf="parent" />


</androidx.constraintlayout.widget.ConstraintLayout>
화면전환 전 자바코드

package com.example.a20151544;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {


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

        Button button = findViewById(R.id.button);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(getApplicationContext(), checkbox.class);
                startActivity(intent);
            }
        });
    }
}
매니페스트 코드

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.a20151544">

    <application
        android:allowBackup="false"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.20151544">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".checkbox"/>
    </application>

</manifest>

1개의 답변

0 추천

액티비티 전환하는 부분이 잘못되어 있습니다. 여기서 앱크래시가 발생할 것으로 보입니다.

button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this, checkbox.class);
                startActivity(intent);
            }
});

위처럼 Intent에 넘기시는 Context를 액티비티 자신으로 지정해주셔야 해요. 만약 baseContext나 applicationContext밖에 사용할 수 없는 경우(예를 들면, Service, BroadCastReceiver, Application class) 라면, 아래처럼 task를 새로 만들어 주는 flag 를 추가해 주어야 합니다.

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

안드로이드에서 Context를 파라미터로 받는 경우는 그에 적절한 Context 를 넘기셔야 해요. 예를 들면 Dialog의 경우는 Activity나 Fragment의 Context를 넘겨야 하구요. 해당 함수가 어떤 Context를 받아야 하는지 확인해 보시고 사용하시는 게 안전할 것 같습니다.

spark (224,800 포인트) 님이 2021년 10월 8일 답변
spark님이 2021년 10월 8일 수정
클래스의 이름을 수정하시길 강력하게 권장드려요. 특히 checkbox는 실제 CheckBox클래스도 아니고 안드로이드에 이미 같은 클래스가 있기 때문에 꼭 적절한 이름으로 수정하세요. 안드로이드에서는 액티비티는 -Activity,  프레그먼트는 -Fragment로 끝나도록 이름을 짓습니다.
StatusCheckInActivity 정도로 해도 될 것 같은데요.
제가 이해한게 맞다면

package com.example.a20151544;
 
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.TextView;
 
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
 
public class StatusCheckinActivity extends AppCompatActivity {
 
 
    @SuppressLint("SetTextI18n")
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.checkbox);
 
 
        final CheckBox cb1 = findViewById(R.id.checkBox1);
        final CheckBox cb2 = findViewById(R.id.checkBox2);
        final CheckBox cb3 = findViewById(R.id.checkBox3);
        final Button b = findViewById(R.id.button1);
        final TextView tv = findViewById(R.id.textView2);
 
 
        b.setOnClickListener(new View.OnClickListener() {
            @override
            public void onClick(View view) {
                   Intent intent = new Intent(MainActivity.this, StatusCheckInActivity.class);
                   startActivity(intent);
             }
                   
            String result = "";
            if(cb1.isChecked()) result += cb1.getText().toString();
            if(cb2.isChecked()) result += cb2.getText().toString();
            if(cb3.isChecked()) result += cb3.getText().toString();
            tv.setText("선택결과:" + result);
 
        });
    }
}

로 바꿔줘야 하는게 말씀하신 부분인가요?

new View.onClickListener() { 부분에 람다 경고창이 떠서 찾아봐도 어떻게 고쳐야될지 몰라서  alt+enter로 자동완성 한거라..

답변 정말 감사드립니다.
맞는데, 아랫부분은 syntax 에러처럼 보이네요.
b.setOnClickListener(new View.OnClickListener() {
            @override
            public void onClick(View view) {
                   Intent intent = new Intent(MainActivity.this, StatusCheckInActivity.class);
                   startActivity(intent);
             }
                   
            // 아래 부분은 onClick안으로 들어가던가 아니면 setOnClickListener 밖으로 빼시던가 해야할 것 같은데요.
            String result = "";
            if(cb1.isChecked()) result += cb1.getText().toString();
            if(cb2.isChecked()) result += cb2.getText().toString();
            if(cb3.isChecked()) result += cb3.getText().toString();
            tv.setText("선택결과:" + result);
 
        });
...