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

[도움좀주세요ㅠㅠ] 간단한 내용 질문있습니다!!

0 추천

 

안녕하세요~

안드로이드로, 연습문제같은것을 풀어보면서 실력을 쌓고있는

학생입니다. 다름이 아니라 아래의 사진과 같은 모양을 만들기

위해서 소스를 만들고 있습니다.

그런데 사실 다 만들었는데, 희안하게도 다른 부분은 전부 다

이해가 잘 가는데, 토글버튼에서 삼항연산자를 줘서 실행을 하는

부분이 이해가 가질 않아서.. 저 토글부분을 좀 더 초보자인 제가 이해하

기 쉽게 바꾸어 보려고 하는데 쉽게 바뀌질 않습니다 ㅠㅠ..

토글부분이 잘 이해가가지 않아서 그러는데, 제가 아래에 쓴 코드식이

아니라, 좀 더 다른 방식으로 이해하기 쉽게 바꾸어 주실수 있는지 궁금

합니다 ㅠㅠ

 

 

 

 

 

package ex.project3;

import android.os.Bundle;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ToggleButton;

public class MainActivity extends AppCompatActivity {

    Button btn;
    RadioGroup g1;
    RadioButton r1;
    RadioButton r2;
    RadioButton r3;
    ImageView i1;
    ToggleButton t1;

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

        btn = (Button) findViewById(R.id.button5);
        g1 = (RadioGroup) findViewById(R.id.tttt);
        r3 = (RadioButton) findViewById(R.id.radioButton);
        r1 = (RadioButton) findViewById(R.id.radioButton2);
        r2 = (RadioButton) findViewById(R.id.radioButton3);
        i1 = (ImageView) findViewById(R.id.imageView);
        t1 = (ToggleButton) findViewById(R.id.toggleButton);


        t1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                g1.setVisibility(isChecked ? View.VISIBLE : View.INVISIBLE);
            }
        });


        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                i1.setVisibility(View.VISIBLE);
                switch(g1.getCheckedRadioButtonId())
                {
                    case R.id.radioButton:
                        i1.setImageResource(R.drawable.apple);
                        break;

                    case R.id.radioButton2:
                        i1.setImageResource(R.drawable.orange);
                        break;

                    case R.id.radioButton3:
                        i1.setImageResource(R.drawable.subak);
                        break;
                }
            }
        });
    }
}
Kind카인드 (3,600 포인트) 님이 2016년 10월 9일 질문

2개의 답변

0 추천
isChecked가 트루면 보여주고

펄스면 안보여준다고요

토글 온/오프 체크를 뜻하는거겟죠

삼항연산자가 뭔지는 아시죠 삼항연산자  쓰기싫으면 이프엘스 쓰면 되겟네요

 

그리고 변수명에 좀 더 신경써보세요
dexter 님이 2016년 10월 9일 답변
답변 감사합니다
.그런데, 토글부분에 이벤트에 지금 그룹관련해서 보여주느냐
안보여주느냐의 코드를 작성했는데, 왜 토글이벤트 부분에서
토글이 켜질떄와 안켜질때는 if문으로 쓰지 않아도 되는거죠?

지금 보면, 토글이 켜져있는지 안켜져있는지는 확인을 안하고
바로 g1.setVisibility를 사용하는데, 이렇게 되면 setvisibility안의
ischecked가 g1의 내용이 아니라, 토글부분의 ischecked가 되어서 안쪽의 삼항연산자 부분이 처리가 되는건가요..?
0 추천
isChecked ? View.Visibility : View.Gone;

삼항연산자는 아래와 같은 문법구조를 가집니다.

condition ? A : B

맨 앞에 오는 게 조건식이구요 if 문과 똑같습니다. condition이 true이면 A를 false이면 B를 실행시키게 됩니다.

if (condition == true)
    A
else
    B

로 해석됩니다.
spark (227,910 포인트) 님이 2016년 10월 9일 답변
답변 감사합니다
.그런데, 토글부분에 이벤트에 지금 그룹관련해서 보여주느냐
안보여주느냐의 코드를 작성했는데, 왜 토글이벤트 부분에서
토글이 켜질떄와 안켜질때는 if문으로 쓰지 않아도 되는거죠?

지금 보면, 토글이 켜져있는지 안켜져있는지는 확인을 안하고
바로 g1.setVisibility를 사용하는데, 이렇게 되면 setvisibility안의
ischecked가 g1의 내용이 아니라, 토글부분의 ischecked가 되어서 안쪽의 삼항연산자 부분이 처리가 되는건가요..?
t1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                g1.setVisibility(isChecked ? View.VISIBLE : View.INVISIBLE);
            }
        });

를 놓고 보면 이건  t1의 이벤트 리스너입니다. 따라서 onCheckedChanged 메소드에는 t1과 관련된 값이 넘어오겠죠? t1를 토글하는거니까요. t1이 on상태가 되면 isChecked 에 true가 세팅되어서 넘어오고 off가 되면 false 가 넘어오겠죠.  님이 원하시는 게 t1의 상태에 따라서 g1을 보여주고 안보여주고 하는 거 아닌가요?
아하 그렇군요 ..
인자값의 boolean isChecked에서 on이었을떄 true가 넘어와서
g1.setviibility가 실행되고, false가 된다면 실행하지 않는다는
뜻인거네요?

그리고 만약 true가 넘어오면 g1.setvisibility를 통해서
뷰가 보여지고 만약 false가 넘어오면 안보여지고 ..

 혹시 이 과정이 맞나요? 그리고 VISIBLE과 INVISIBLE은
이해가 가는데 앞의 View가 붙는 이유는 뭔가요?
Android View class를 확인해 보세요. https://developer.android.com/reference/android/view/View.html
https://developer.android.com/reference/android/view/View.html#setVisibility(int)

View 클래스 안에 constant로 선언이 되어 있습니다.  constant = final static 이고 heap이라는 메모리 영역에 적재되어서 별도로 객체를 생성하지 않아도 View 라는 클래스명을 통해 바로 접근이 가능합니다.

안드로이드 API문서와 개발자 가이드는 꾸준히 참조하셔야 합니다.
그리고 저도 많이 부족하다고 느끼는 것이기도 하고 모든 프로그램밍의 기초가 되는게 데이터구조, 알고리즘, 디자인패턴 등입니다. 좋은 프로그래머가 되기 위해서는 여기에 시간을 많이 투자하셔야 합니다. 세계 굴지의  IT 기업들에서 인재를 채용할 때 주로 물어보는 문제들이기도 합니다.
크 ㅠㅠ 뼈가되고 살이되는 답변 정말 감사합니다.
마지막으로 spark님 정말 궁금한게 있습니다.
시작할때, 애초에 토글부분이 off가 되어서 라디오그룹과 이미지
그룹부분과 버튼을 안보이게 하고 싶은데.. 생각했던것처럼
잘 되지 않아서 다시 이렇게 답변을 달게 되었습니다..

토글부분을 애초에 시작할때, off를 주면 될것 같아서 t1.setChecked(false); 를 주었건만..  쉽게 사라지지 않네요 ㅠㅠ
어떻게 해야, 토글과 textview의 시작해볼까요?를 뺀 나머지를
사라지게 할 수 있을까요 .. 물론 토글이 on 되었을때는 좋아하는 음식은? 이라는 문장과 라디오그룹, 그리고 버튼과 이미지뷰가
나타냐아합니다 ㅠㅠ..

그리고 요즘 안드로이드 버전이 패치가 되어서 이미지뷰를 시작할때 아무런 이미지를 주게 하고싶지 않은데 이부분을 어떻게 해야 하나요 ㅠㅠ 이미지뷰를 디자인부분에 위젯으로 끌어다 쓸경우에 사진을 고르라는 창(?) 같은것이 계속 떠서 이부분에서 매번
아무사진이나 고르는 바람에 프로그램을 실행시켰을때 연관되지 않은 사진이 있어서.. 좀 그렇네요 ㅠ ㅠ
...