【问题标题】:Delegate between fragment and Activity called but visibility change not triggered调用片段和活动之间的委托,但未触发可见性更改
【发布时间】:2016-12-05 15:27:58
【问题描述】:

我有一个浏览器。它有 3 页。从活动中,当按下片段上的按钮时,我必须播放一些音乐文件。在播放过程中,一些按钮将被隐藏,播放后按钮将可见。所以我使用委托在 Activity 和 Fragment 之间进行通信。播放完成后触发的委托函数,但总是返回到片段 0 或 2。总是跳过没有 1 片段。所以它要么启用第 1 页或第 3 页按钮,但不能启用第 2 页。请帮助。

(对不起我的英语不好)

我的界面:

PlayResult.java

public interface PlayResult {
    void PlayCompleted(boolean output);
}

PlayActivity.java

public PlayResult playDelegate = null;
void play()
{
try
        {
            try {
                if(mp != null && mp.isPlaying())
                    mp.stop();
                mp = null;
            }
            catch (Exception ex){}
            mp = MediaPlayer.create(PlayActivity.this, StaticClass.getAudioResourceId(fileName, PlayActivity.this));
            mp.start();
            mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mediaPlayer) {
                    try {
                        mp.stop();
                        mp.release();
                    }
                    catch (Exception ex){}
                    if(playingButton != null)
                    {
                        try {
                            Thread.sleep(1000);
                            playMusic(dm.audio, dm, null, showButton);
                        }
                        catch (Exception ex)
                        {
                            //Log.e("error thread", ex.getMessage());
                        }
                    }
                    else
                    {
                        playDelegate.PlayCompleted(true);
                        //showButton();
                    }



                }
            });
        }
        catch (Exception ex){ //Log.e("error playing", ex.getMessage()+ ex.getCause());

        }

}

在我的片段中

viewpager_fragment.java

PlayActivity playActivity;

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            view = inflater.inflate((R.layout.viewpager_layout), container, false);
            _context = view.getContext();

           imgButton1 = (ImageView) view.findViewById(R.id.imgButton1);

           imgButton1.setOnClickListener(new View.OnClickListener() {
            @Override
             public void onClick(View v) {
               playMusic(dm.b1audio, dm, imgButton1,imgButton1);
             }
           });
         imgButton2 = (ImageView) view.findViewById(R.id.imgButton2);

         imgButton2.setOnClickListener(new View.OnClickListener() {
         @Override
              public void onClick(View v) {
                 playMusic(dm.b2audio, dm, imgButton2,imgButton2);
          }
         });

        img = (ImageView) view.findViewById(R.id.image);
        img.setImageResource(StaticClass.getResourceId(dm.image, _context));


             btnMoveForward = (ImageView) view.findViewById(R.id.btnMoveForward);
                playActivity = (PlayActivity) getActivity();
                playActivity.playDelegate = this;


         }



     private void showButton()
        {
            btnMoveBackward.setVisibility(View.VISIBLE);
            btnMoveForward.setVisibility(View.VISIBLE);
            btnHome.setVisibility(View.VISIBLE);

            imgButton1.setVisibility(View.VISIBLE);
            imgButton2.setVisibility(View.VISIBLE);
            imgButton1.setEnabled(true);
            imgButton2.setEnabled(true);

        }
     void playMusic(String fileName, final DataModel dm , final ImageView playingButton, final ImageView showButton)
        {
            hideButton(showButton);
            playActivity.playMusic(fileName, dm, playingButton, showButton);
        }

        @Override
        public void PlayCompleted(boolean output) {

            showButton();
            Log.e("Play completed del", "from delegate"+ ", dm "+dm.pageno+ btnHome.getVisibility());
        }

【问题讨论】:

  • 显示按钮方法未调用或按钮未切换? showButton() 中的按钮在哪里初始化?
  • 这些按钮在 onCreateView() 中初始化。那里有很多垃圾代码,我没有提到它。对不起。

标签: android android-fragments delegates android-viewpager


【解决方案1】:

您正在fragment.createView 中设置委托 您还使用 ViewPager 来处理处理其生命周期的片段。因此,每次寻呼机创建一个新片段时,您在活动中的委托都会被替换。

View pager and fragment lifecycle

这显示了如何确定当前可见的片段。

【讨论】:

    【解决方案2】:

    问题是回调应该在你命名委托的片段中。使用接口对象,当您单击时,您可以在 fragme t 中调用方法,但该方法应该在活动中实现。你几乎不这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-21
      • 1970-01-01
      • 1970-01-01
      • 2015-05-01
      • 2018-02-16
      • 2014-06-16
      • 2015-11-27
      相关资源
      最近更新 更多