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

Seekbar에 onProgressChanged 메소드가 작동하지 않는 것 같습니다. [closed]

0 추천

저번에 removeView() 에러 관련해서 질문 올렸던 사람인데요

일단 화면으로 플래시를 쓰는 기능에 메뉴버튼을 누르면 색 설정 버튼이 나오고 그 버튼을 누르면

배경화면 색을 설정할 수 있는 AlertDialog창이 나옵니다.

여기엔 R, G, B 별로 Seekbar 3개가 있고 각 옆에는 EditText가 있어요. 대략..

이런 모습인데요, 저 Seekbar 를 움직이면 옆에 EditText에다가 Seekbar 조절값을 setText 하게 해주고

각 Seekbar를 조절하면 배경화면 색이 바뀌도록 코드를 짯는데 문제는 작동을 안하네요.

제가 inflate를 사용하여 View 객체를 가져왔는데 그 과정에서 뭘 하나 빼먹은거 같은데..

onProgressChanged 메소드 안에 Seekbar를 조절할때 로그를 찍어봤는데 로그도 안찍히네요. 마치 메소드가 작동하지 않는것처럼..

코드 올려드릴게요.

package com.example.flashlight;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.WindowManager;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.SeekBar;

public class ScreenLight extends Activity {

    private LinearLayout mFlash_screen;
    private WindowManager.LayoutParams mScreen;
    SeekBar mSeekbarRed;
    SeekBar mSeekbarGreen;
    SeekBar mSeekbarBlue;
    EditText RedEditText;
    EditText GreenEditText;
    EditText BlueEditText;
    int r = 255;
    int g = 255;
    int b = 255;

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

        mFlash_screen = (LinearLayout) findViewById(R.id.flash_screen);
        mScreen = getWindow().getAttributes();
        mScreen.screenBrightness = 1f;
        getWindow().setAttributes(mScreen);

        mFlash_screen.setBackgroundColor(Color.rgb(r, g, b)); //배경색을 초기화 한다.
        //XML 레이아웃을 View 객체로 전개
        View view = getLayoutInflater().inflate(R.layout.coloroption_dialog, null);

        RedEditText = (EditText)view.findViewById(R.id.RedEditText);
        GreenEditText = (EditText)view.findViewById(R.id.GreenEditText);
        BlueEditText = (EditText)view.findViewById(R.id.BlueEditText);

        mSeekbarRed = (SeekBar)view.findViewById(R.id.RedSeekBar);
        mSeekbarGreen = (SeekBar)view.findViewById(R.id.GreenSeekBar);
        mSeekbarBlue = (SeekBar)view.findViewById(R.id.BlueSeekBar);

        mSeekbarRed.setOnSeekBarChangeListener(onSeekbarChangeListener);
        mSeekbarGreen.setOnSeekBarChangeListener(onSeekbarChangeListener);
        mSeekbarBlue.setOnSeekBarChangeListener(onSeekbarChangeListener);
    }

    @Override
    public boolean onCreateOptionsMenu (Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.screenlight, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected (MenuItem item) {
        switch (item.getItemId()) {
            case R.id.coloroption:
                createAlertDialog().show();
                break;
            default:
                break;
        }

        return super.onOptionsItemSelected(item);
    }

    private SeekBar.OnSeekBarChangeListener onSeekbarChangeListener = new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged (SeekBar seekBar, int progress, boolean fromUser) {
            r = mSeekbarRed.getProgress();
            g = mSeekbarGreen.getProgress();
            b = mSeekbarBlue.getProgress();
            mFlash_screen.setBackgroundColor(Color.rgb(r, g, b));

            RedEditText.setText(mSeekbarRed.getProgress());
            GreenEditText.setText(mSeekbarGreen.getProgress());
            BlueEditText.setText(mSeekbarGreen.getProgress());
        }

        @Override
        public void onStartTrackingTouch (SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch (SeekBar seekBar) {

        }
    };

    private AlertDialog createAlertDialog () {
        View innerView = getLayoutInflater().inflate(R.layout.coloroption_dialog, null);
        final AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setView(innerView).setTitle("배경색 설정").setPositiveButton("닫기", new DialogInterface.OnClickListener() {
            @Override
            public void onClick (DialogInterface dialogInterface, int i) {
                dialogInterface.dismiss();
            }
        });
        return builder.create();
    }


    @Override
    protected void onStart () {
        super.onStart();
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    }

    @Override
    protected void onPause () {
        super.onPause();
        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    }

    @Override
    protected void onDestroy () {
        super.onDestroy();

        mScreen.screenBrightness = 0f; // (중요!)이게 없으면 폰에 버그가 생긴다.
        getWindow().setAttributes(mScreen);
    }
}

 

질문을 종료한 이유: 해결했습니다. inflate를 두번했었군요..
라이비 (150 포인트) 님이 2015년 6월 15일 질문
라이비님이 2015년 6월 19일 closed

1개의 답변

+1 추천

안녕하세요

Dialog 안에서 발생하는 일이라면 createAlertDialog안에서 view관련 처리를 해보세요

(아래의 코드와 같이 view생성 및 setOnSeekBarChangeListener등 작업들을 해보세요~~ )

mSeekbarRed = (SeekBar)innerView.findViewById(R.id.RedSeekBar);
.........
mSeekbarRed.setOnSeekBarChangeListener(onSeekbarChangeListener);
.........

 

dubudub (930 포인트) 님이 2015년 6월 15일 답변
dubudub님이 2015년 6월 15일 수정
감사합니다. 해볼게요.
그렇게 해봤는데도 안되네요.
ㅜㅜ 쿨럭;; 실제로 봐야 뭔가 도움을 드릴 수 있을 것 같네요... 죄송... ㅜ 감이 안와요..
가능하시다면 어떻게 바꾸셨는지 본문처럼 코드를 한 번 올려주시겠어요?
private AlertDialog createAlertDialog () {
        View innerView = getLayoutInflater().inflate(R.layout.coloroption_dialog, null);
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setView(innerView).setTitle("배경색 설정").setPositiveButton("닫기", new DialogInterface.OnClickListener() {
            @Override
            public void onClick (DialogInterface dialogInterface, int i) {
                dialogInterface.dismiss();
            }
        });

        //XML 레이아웃을 View 객체로 전개
        View view = getLayoutInflater().inflate(R.layout.coloroption_dialog, null);

        RedEditText = (EditText)view.findViewById(R.id.RedEditText);
        GreenEditText = (EditText)view.findViewById(R.id.GreenEditText);
        BlueEditText = (EditText)view.findViewById(R.id.BlueEditText);

        mSeekbarRed = (SeekBar)view.findViewById(R.id.RedSeekBar);
        mSeekbarGreen = (SeekBar)view.findViewById(R.id.GreenSeekBar);
        mSeekbarBlue = (SeekBar)view.findViewById(R.id.BlueSeekBar);

        mSeekbarRed.setProgress(255);
        mSeekbarGreen.setProgress(255);
        mSeekbarBlue.setProgress(255);


        SeekBar.OnSeekBarChangeListener onSeekbarChangeListener = new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged (SeekBar seekBar, int progress, boolean fromUser) {
                r = mSeekbarRed.getProgress();
                g = mSeekbarGreen.getProgress();
                b = mSeekbarBlue.getProgress();
                mFlash_screen.setBackgroundColor(Color.rgb(r, g, b));
                

                RedEditText.setText(mSeekbarRed.getProgress());
                GreenEditText.setText(mSeekbarGreen.getProgress());
                BlueEditText.setText(mSeekbarGreen.getProgress());
            }

            @Override
            public void onStartTrackingTouch (SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch (SeekBar seekBar) {

            }
        };

        mSeekbarRed.setOnSeekBarChangeListener(onSeekbarChangeListener);
        mSeekbarGreen.setOnSeekBarChangeListener(onSeekbarChangeListener);
        mSeekbarBlue.setOnSeekBarChangeListener(onSeekbarChangeListener);

        return builder.create();
    }

이런식으로...
SeekBar 리스너를 하나만 등록하고 로그 찍어 보셨을까요?

하나 일때는 제대로 동작 하나요? 아니면 하나만 설정 해도 여전히 문제일까요??

mSeekbarRed.setOnSeekBarChangeListener(onSeekbarChangeListener);
//주석처리
//mSeekbarGreen.setOnSeekBarChangeListener(onSeekbarChangeListener);
//mSeekbarBlue.setOnSeekBarChangeListener(onSeekbarChangeListener);
원래 리스너 매소드 하나만 써두고 달아줄때는 저렇게 하나만 달아주면 작동을 해요.
그리고, 두개 주석처리 해도 작동을 안하네요..
...