碎片方法没有被调用

时间:2015-12-21 15:57:42

标签: android android-fragments android-viewpager

我已在[{1}}。

中实施了导航抽屉
  • 我有5个导航抽屉项目,每个项目都有一个片段。每个片段都有Share方法(不常见)。
  • 在第一个导航抽屉项目的片段中可以说 OldStory Fragment ,我正在使用Viewpager滑动视图,其中包含3个使用FragmentStatePagerAdapter的片段。它有Share方法。

问题   - 即使屏幕上显示其他片段,每次都会调用来自故事片段的分享方法。经过调试后,我开始知道来自 Story 片段的方法正在被调用。   - 如果我禁用OldStory Fragment,那么一切正常。

我无法解决这个问题。我读了很多问题/答案,但它们与Activity和Fragment方法有关。请帮我解决这个问题。

注意 - OldStory 片段具有扩展FragmentStatePagerAdapter类的内部类。此课程会创建许多故事片段。其他实现是一样的。

Android Studio 1.5.1

故事片段方法实施 -

public class OldStory extends Fragment {

private StoryPagerAdapter storyPagerAdapter;
private InfiniteViewPager viewPager;
SharedPreferences sharedPreferences;
private int TotalCount;

public OldStory() {
    // Required empty public constructor
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Notify the system to allow an options menu for this fragment.

}



@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    final View rootView = inflater.inflate(R.layout.fragment_old_story, container, false);
    viewPager = (InfiniteViewPager) rootView.findViewById(R.id.pager);
    viewPager.setOffscreenPageLimit(0);
    sharedPreferences = getActivity().getSharedPreferences(Startup.PreferenceSETTINGS, Context.MODE_PRIVATE);
    TotalCount = sharedPreferences.getInt(Startup.StoryCount, 4);
    storyPagerAdapter = new StoryPagerAdapter(getFragmentManager());
    PagerAdapter wrappedAdapter = new InfinitePagerAdapter(storyPagerAdapter);
    viewPager.setAdapter(wrappedAdapter);
    viewPager.setCurrentItem(TotalCount-1);

    return rootView;
}

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

    @Override
    public Fragment getItem(int position) {

        return Story.newInstance(position+1);
    }

    @Override
    public int getCount() {
        return TotalCount;
    }
}
}
用于切换片段的

MainActivity

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {

    menu.clear();
    inflater.inflate(R.menu.story, menu);
    getActivity().getMenuInflater().inflate(R.menu.main, menu);
}


@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.Refresh:
            // We make sure that the SwipeRefreshLayout is displaying it's refreshing indicator
            if(!visiblity) {
                if (!RefreshLayout.isRefreshing()) {
                    ErrorLayout.setVisibility(View.GONE);
                    RefreshLayout.setRefreshing(true);
                }

                // Start our refresh background task
                initiateRequest(Today);
            }
            return true;

        case R.id.Share:
            //InShort = sharedPreferences.getString(Startup.InShort, null);
            Toast.makeText(getContext(), "Stories", Toast.LENGTH_SHORT).show();
            if (InShort!= null && !InShort.isEmpty())
            {

                Intent sendIntent = new Intent(Intent.ACTION_SEND);
                sendIntent.putExtra(Intent.EXTRA_TEXT, "Hi From Story");
                sendIntent.setType("text/plain");
                startActivity(sendIntent);
            }

            return true;

        default:
            return super.onOptionsItemSelected(item);
    }


}

2 个答案:

答案 0 :(得分:2)

我不确定这是否真的是您的问题的答案,但我发现您的代码中有一个错误:

storyPagerAdapter = new StoryPagerAdapter(getFragmentManager());

将无法正常工作,因为您需要使用getChildFragmentManager()来管理片段内的片段。

答案 1 :(得分:1)

我试图重现您的问题并撰写此应用,正如我从问题中理解的那样是复制应用的行为:

enter image description here

我已将其源代码上传到我的Dropbox - feel free to check it out

如您所见,片段正确处理共享按钮单击。 总有机会,我没有完全理解你的问题,但这就是我如何做到的:

所有片段都会膨胀此菜单(但具有不同的onOptionsItemSelected):

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/nav_share"
        android:icon="@drawable/ic_menu_share"
        app:showAsAction="always"
        android:title="Share" />
</menu>

SubFragment中我的ViewPager课程(我在FragmentA内使用的课程):

public class SubFragment extends Fragment {

    String msg;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.subfragmnet, container, false);
        setHasOptionsMenu(true);
        rootView.findViewById(R.id.subfragmentFrameLayout).setBackgroundColor(getArguments().getInt("background"));
        msg = getArguments().getString("msg");
        return rootView;
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.menu_fragment, menu);
        super.onCreateOptionsMenu(menu, inflater);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == R.id.nav_share) {
            Snackbar.make(getView(), "Hello from SubFragment " + msg, Snackbar.LENGTH_LONG).show();
        }

        return super.onOptionsItemSelected(item);
    }
}

FragmentA,第一个Fragment,托管ViewPager和嵌套Fragment s:

public class FragmentA extends Fragment {

    PagerAdapter pagerAdapter;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_a, container, false);

        Bundle bundle1 = new Bundle();
        bundle1.putInt("background", Color.RED);
        bundle1.putString("msg", "page 1");

        Bundle bundle2 = new Bundle();
        bundle2.putInt("background", Color.YELLOW);
        bundle2.putString("msg", "page 2");

        Bundle bundle3 = new Bundle();
        bundle3.putInt("background", Color.BLUE);
        bundle3.putString("msg", "page 3");

        Fragment[] fragments = {
                Fragment.instantiate(getContext(), SubFragment.class.getName(), bundle1),
                Fragment.instantiate(getContext(), SubFragment.class.getName(), bundle2),
                Fragment.instantiate(getContext(), SubFragment.class.getName(), bundle3),
        };

        if (pagerAdapter == null) {
            pagerAdapter = new PagerAdapter(getChildFragmentManager(), fragments);
        }

        ViewPager viewPager = (ViewPager)rootView.findViewById(R.id.viewPager);
        viewPager.setAdapter(pagerAdapter);

        return rootView;
    }
}

FragmentB(和FragmentC几乎相同):

public class FragmentB extends Fragment {

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        setHasOptionsMenu(true);
        return inflater.inflate(R.layout.fragment_b, container, false);
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.menu_fragment, menu);
        super.onCreateOptionsMenu(menu, inflater);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == R.id.nav_share) {
            Toast.makeText(getContext(), "Hello from Fragment B", Toast.LENGTH_LONG).show();
        }

        return super.onOptionsItemSelected(item);
    }
}

托管活动是标准的NavigationDrawer活动,正在切换抽屉项目上的碎片。

public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        ....

        getSupportFragmentManager().beginTransaction().replace(R.id.container, Fragment.instantiate(this, FragmentA.class.getName())).commit();
    }

    ...

    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        int id = item.getItemId();

        if (id == R.id.nav_camera) {
            getSupportFragmentManager().beginTransaction().replace(R.id.container, Fragment.instantiate(this, FragmentA.class.getName())).commit();
        } else if (id == R.id.nav_gallery) {
            getSupportFragmentManager().beginTransaction().replace(R.id.container, Fragment.instantiate(this, FragmentB.class.getName())).commit();
        } else if (id == R.id.nav_slideshow) {
            getSupportFragmentManager().beginTransaction().replace(R.id.container, Fragment.instantiate(this, FragmentC.class.getName())).commit();
        }

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }
}

如果我理解你的问题,请告诉我!

无论如何,我希望,这有帮助。

相关问题