Nei*_*eil 10 android android-fragments actionbarsherlock android-support-library slidingmenu
我在应用程序的ActionBar中一直设置动画"刷新"图标时遇到一些问题.
我有一个容器FragmentActivity,当用户在应用程序中导航时(从片段本身内部或从SlidingMenu选项中)交换片段.因此,当应用程序首次加载时,我的FragmentContainer会添加FragA.从FragA,用户可以导航到FragB,然后交换进来.
在操作栏中,我显示一个静态的"刷新"图标.当每个Fragment加载时,我用动画"spinner"图标替换它.加载完成后,我将恢复为原始刷新图标.
问题是,此动画仅适用于原始片段(在本例中为FragA).当用户导航到FragB并选择刷新图标时,将触发刷新,但动画永远不会发生.类似地,如果按下后退按钮返回到FragA,则现在遵循相同的模式,即按下时刷新按钮不动画.
注意事项......
SlidingFragmentActivity.setHasOptionsMenu(true)- 我已经通过这个调试了,并且onCreateOptionsMenu每个都正确调用.FragmentTransaction.remove()和add()而不是replace()因为我以前有过后退按钮的问题与replace()-我使用的兼容性lib和我读了这里的replace实现是一个有点马车-并且不使用固定的肯定我所看到的问题.代码片段如下:
我加载原始片段的代码是....
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.add(R.id.content_frame, new FragA());
ft.addToBackStack(null);
ft.commit();
Run Code Online (Sandbox Code Playgroud)
为FragA'交换'FragB ....
public void switchContent(PysoBaseFragment fragment) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.remove(existingFragment);
ft.add(R.id.content_frame, fragment);
ft.addToBackStack(null);
ft.commit();
}
Run Code Online (Sandbox Code Playgroud)
此方法在容器活动中声明,并从FragA调用,即...
getFragmentContainer().switchContent(new FragB());
Run Code Online (Sandbox Code Playgroud)
旋转图标的代码在开始加载时从新的Fragment中调用.有点像......
ImageView spinnerActionView = (ImageView) inflater.inflate(R.layout.refresh_action_view, null);
Animation rotation = AnimationUtils.loadAnimation(this, R.anim.rotate_animation);
rotation.setRepeatCount(Animation.INFINITE);
spinnerActionView.startAnimation(rotation);
menuItemRefresh = menu.findItem(R.id.menu_refresh);
menuItemRefresh.setActionView(spinnerActionView);
Run Code Online (Sandbox Code Playgroud)
凡menu被分配到容器的实例变量时onCreateOptionsMenu被调用.
更新:
我注意到这个领域还有一个奇怪的错误(我很高兴将此作为一个单独的问题添加,但我在这里更新它希望它能解释我原来的问题 - 我相信两者都是由我如何从我的片段配置我的动作栏).
当我第一次加载片段时,我显示了1个静态刷新图标.如果我旋转屏幕......会出现另一个刷新图标...当我向后旋转屏幕时,会出现第三个刷新图标!
更奇怪的是,单击后退按钮会依次删除每个附加图标,最后(在第4次点击时)返回上一个屏幕.
永远不要在某处更改菜单项,除非
onPrepareOtionsMenu(){
}
Run Code Online (Sandbox Code Playgroud)
你应该像这样。
在您的活动中:
boolean mIsRefreshing =false;
public boolean onPrepareOptionsMenu(Menu menu) {
if(mIsRefreshing){
final MenuItem menuItemRefresh = menu.findItem(R.id.menu_refresh);
menuItemRefresh.setActionView(spinnerActionView);
}
return true;
}
public void setRefreshing(boolean refreshing){
mIsRefreshing = refreshing;
invalidateOptionsMenu(); //supportInvelidateOptionsMenu()
}
Run Code Online (Sandbox Code Playgroud)
所以现在你可以从你的框架中调用
((YourActivity)getActivity()).setRefreshing(true);
((YourActivity)getActivity()).setRefreshing(false);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2768 次 |
| 最近记录: |