首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >无法与OnClick\OnItemClickListener中的视图及其事件交互

无法与OnClick\OnItemClickListener中的视图及其事件交互
EN

Stack Overflow用户
提问于 2018-05-27 01:43:24
回答 3查看 47关注 0票数 -1
代码语言:javascript
复制
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)));
            }
        };
    }
}

这段代码的问题是:我正在尝试为两个按钮volupvoldown更改OnClickListener(volchange)中的STREAM_MUSIC音量。由于某些原因,OnClickListener无法触发,但如果我打开日志,则不会显示任何错误、警告或可疑日志。是什么导致了这种行为?

正如在评论中提到的,这篇文章中不必要的代码部分被删掉了。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-05-29 07:41:40

为了解决这个问题,在volup**/**voldown dialogview ImageButtons被膨胀之后,在OnItemClickListener中初始化-ImageButtons。虽然在类构造函数中初始化了,但这一步需要完成。应该对每个其他视图/小部件执行相同的过程,这些小部件能够通过调用相关方法在UIThread上进行更新。

为什么会有这样的行为?

理论上,在类构造函数中膨胀dialogview之后,我们可以正确地初始化视图和窗口小部件。但是当我们在构造函数中膨胀dialogview时(在初始化OnItemClickListener之前),布局本身就会膨胀,直接在调用构造函数之后,并从“二进制”膨胀的布局中获得视图。但问题来了:每次触发OnItemClickListener时,新的二进制布局都会膨胀并保存到dialogview中。因此,现在应用于dialog的布局是来自dialogview-Variable,的新创建的二进制布局,但volup & voldown ImageButtons仍然引用先前创建的二进制布局,当我们调用类构造函数时。显然,如果我们在每次创建dialogview之后都初始化ImageButtons,这些按钮就会引用正确的、新的膨胀布局。

票数 0
EN

Stack Overflow用户

发布于 2018-05-27 02:27:38

尝试删除图像按钮局部声明的final关键字

票数 0
EN

Stack Overflow用户

发布于 2018-05-27 03:08:05

我认为您需要从ImageButton中删除"final“。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50545482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档