Не может взаимодействовать с представлениями и их событиями внутри OnClick \ OnItemClickListener - PullRequest
0 голосов
/ 26 мая 2018
package com.example.android.miwok;

//all the imports

public class VocabularyManager extends Application{
    ProgressBar progress;
    ImageButton volup;
    ImageButton voldown;
    TextView current_vol_text;
    //[Cut-out Definitions of Variables]
    ImageButton.OnClickListener changevol;
    public VocabularyManager(Activity activity, Context context, String Category) {
        //Don't wonder, many things up here are also cut-out
        dialogview = inflater.inflate(R.layout.player_dialog, null);
        volup = dialogview.findViewById(R.id.vol_up); //MARKER #1
        voldown = dialogview.findViewById(R.id.vol_down); //MARKER #2
        progress = dialogview.findViewById(R.id.progress); //MARKER #3
        list = (ListView) this.act.findViewById(R.id.vocabulary_list);

        listadapter = new WordAdapter(this.act, mwords);

        list.setBackgroundColor(context.getResources().getColor(R.color.category_family));

        list.setAdapter(listadapter);
        list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                list.setEnabled(false);
                Word word = mwords.get(i);
                timer = new Timer();
                dialog = new AlertDialog.Builder(mContext);
                dialogview = inflater.inflate(R.layout.player_dialog, null);
                volup.setOnClickListener(changevol);
                voldown.setOnClickListener(changevol);
                progress = dialogview.findViewById(R.id.progress);
                current_vol_text = dialogview.findViewById(R.id.current_stream_volume);
                current_vol_text.setText(Integer.toString(mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC)));
                //Setting up the 'dialog' AlertDialog.Builder
                crdialog = dialog.create();
                int result = mAudioManager.requestAudioFocus(mOnAudioFocusChangeListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
                if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
                    if(mMediaPlayer == null) {
                        mMediaPlayer = MediaPlayer.create(mContext, word.getAudio());
                        mMediaPlayer.start();
                        mMediaPlayer.setOnCompletionListener(mCompletionListener);
                    }
                }
                progress.setMax(mMediaPlayer.getDuration());
                progress.setProgress(0);
                crdialog.show();
                ttask = new TimerTask() {
                    @Override
                    public void run() {
                        if(mMediaPlayer != null) {
                            progress.setProgress(mMediaPlayer.getCurrentPosition());
                        }
                    }
                };
                timer.scheduleAtFixedRate(ttask, 0, 50);
            }
        });
        changevol = new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(view.getId() == R.id.vol_up){
                    mAudioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,AudioManager.ADJUST_RAISE,0);
                }
                else{
                    mAudioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,AudioManager.ADJUST_LOWER,0);
                }
                current_vol_text.setText(Integer.toString(mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC)));
            }
        };
    }
}

Проблема с этим кодом: Я пытаюсь изменить громкость STREAM_MUSIC внутри OnClickListener (volchange) для двух кнопок volup и voldown.По какой-то причине OnClickListener не запускается, но если я открываю logcat, ошибки, предупреждения или подозрительные журналы не отображаются.Что вызывает такое поведение?

Как и в упомянутых комментариях, ненужные части кода вырезаны для этого поста.

Ответы [ 3 ]

0 голосов
/ 26 мая 2018

Я думаю, вам нужно удалить "финал" из ImageButton.

0 голосов
/ 29 мая 2018

Чтобы решить эту проблему, инициализирует volup / voldown - ImageButtons в OnItemClickListener, после того как dialogview накачено. Хотя виджеты инициализируются в конструкторе класса, этот шаг долженбыть сделаноТа же процедура должна быть сделана для любого другого представления / виджета, который может обновлять UIThread, вызывая соответствующий метод.

Почему это поведение?

Теоретически мы правильно инициализируем представления ивиджеты после надувания dialogview в конструкторе класса.Но когда мы раздуваем dialogview в конструкторе (перед инициализацией OnItemClickListener), сам макет становится раздутым, напрямую после вызова конструктора и из этого «двоичного» раздутого Layout, тогда мы получаем представления, Но здесь возникает проблема: Каждый раз, когда запускается OnItemClickListener, новый двоичный формат раздувается и сохраняется в dialogview.Так что теперь Layout, примененный к dialog, является новым созданным двоичным Layout из dialogview -Variable, , но volup & voldown ImageButtons по-прежнему ссылаются на двоичный Layout, созданный ранее., когда мы однажды вызвали конструктор класса. Очевидно, что если мы инициализируем ImageButtons каждый раз после создания dialogview, кнопки ссылаются на правильный, новый раздутый макет.

0 голосов
/ 26 мая 2018

Попробуйте удалить последнее ключевое слово для локальных объявлений кнопки изображения

...