gpt4 book ai didi

android - Viewpager 初始 fragment 中的操作项未显示

转载 作者:IT老高 更新时间:2023-10-28 21:52:38 24 4
gpt4 key购买 nike

在我正在开发的应用程序中,我使用带有 fragment 的 ViewPager,每个 fragment 都独立于 ViewPager 中的所有其他 fragment 构建自己的菜单。

问题在于,有时默认情况下由 ViewPager 初始化的 fragment (即处于初始状态)没有将它们的项目填充到操作项目菜单中。更糟糕的是,这个问题只是间歇性地发生。如果我在 ViewPager 中滑动得足够多,以至于 fragment 被迫自行重新初始化,那么当我向后滑动时,菜单会正确填充。

Activity 代码:

package net.solarnz.apps.fragmentsample;

import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.os.Bundle;
import android.support.v13.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;

public class FragmentSampleActivity extends Activity {
private ViewPagerAdapter mViewPagerAdapter;
private ViewPager mViewPager;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

if (mViewPagerAdapter == null) {
mViewPagerAdapter = new ViewPagerAdapter(getFragmentManager());
}

mViewPager = (ViewPager) findViewById(R.id.log_pager);
mViewPager.setAdapter(mViewPagerAdapter);
mViewPager.setCurrentItem(0);
}


private class ViewPagerAdapter extends FragmentStatePagerAdapter {
public ViewPagerAdapter(FragmentManager fm) {
super(fm);
}

@Override
public int getCount() {
return 8;
}

@Override
public Fragment getItem(int position) {
Fragment f = Fragment1.newInstance(position);
// f.setRetainInstance(true);
f.setHasOptionsMenu(true);
return f;
}
}
}

fragment 代码:

package net.solarnz.apps.fragmentsample;

import android.app.Fragment;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;

public class Fragment1 extends Fragment {
int mNum;

static Fragment newInstance(int num) {
Fragment1 f = new Fragment1();

// Supply num input as an argument.
Bundle args = new Bundle();
args.putInt("num", num);
f.setArguments(args);

return f;
}

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
mNum = getArguments() != null ? getArguments().getInt("num") : 0;
}

public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.menu_list, menu);
}

}

布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"
android:layout_height="fill_parent" >

<android.support.v4.view.ViewPager
android:id="@+id/log_pager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>

菜单:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/menu_refresh"
android:title="Refresh"
android:icon="@android:drawable/ic_delete"
android:showAsAction="ifRoom|withText" />
</menu>

正在填充的操作菜单: http://i.stack.imgur.com/QFMDd.png

未填充操作菜单: http://i.stack.imgur.com/sH5Pp.png

最佳答案

您应该阅读这篇文章(作者 xcolw...)

通过实验,似乎根本原因是 invalidateOptionsMenu 被多次调用,而主线程没有中断来处理排队的作业。一个猜测 - 如果菜单创建的某些关键部分通过帖子延迟,这将很重要,从而使操作栏处于不良状态,直到它运行。

这可能发生在一些不明显的地方:

  1. 为同一个项目多次调用 viewPager.setCurrentItem

  2. 在 Activity 的 onCreate 中调用 viewPager.setCurrentItem。 setCurrentItem 导致选项菜单失效,紧接着 Activity 的选项菜单失效

我为每个找到的解决方法

  1. 保护对 viewPager.setCurrentItem 的调用

    if (viewPager.getCurrentItem() != position)
    viewPager.setCurrentItem(position);
  2. 在 onCreate 中推迟对 viewPager.setCurrentItem 的调用

    public void onCreate(...) {
    ...
    view.post(new Runnable() {
    public void run() {
    // guarded viewPager.setCurrentItem
    }
    }
    }

在 View 寻呼机内的这些更改选项菜单似乎按预期工作。我希望有人能对此有所了解。

来源 http://code.google.com/p/android/issues/detail?id=29472

关于android - Viewpager 初始 fragment 中的操作项未显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9338122/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com