片段方法不获取调用 [英] Fragment methods are not getting called

查看:103
本文介绍了片段方法不获取调用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已实施的抽屉式导航中给出的 Android的工作室1.5.1


  • 我有5个与片段他们每个人的抽屉式导航栏项目。每个片段都有分享的方法(不常见)。

  • 在第一个抽屉式导航项目的片段,可以说 OldStory片段,我有Viewpager由3个片段与FragmentStatePagerAdapter刷卡视图。它具有共享的方法。

问题
  - 从份额法的故事片段获取调用,即使其他片段显示在屏幕上每一次。调试后,我才知道从的故事片段获取调用该方法。
  - 如果我禁用OldStory片段,然后一切工作正常。

我无法解决这个问题。我看了这么多问题/答案,但它们都涉及到活动和片段的方法。请帮我解决这个问题。

注意 - OldStory 片段具有延伸FragmentStatePagerAdapter类内部类。这个类创建许多故事片段。其他实现一样。

 公共类OldStory扩展片段{私人StoryPagerAdapter storyPagerAdapter;
私人InfiniteViewPager viewPager;
共享preferences共享preferences;
私人诠释TOTALCOUNT;公共OldStory(){
    //必需的空公共构造
}@覆盖
公共无效的onCreate(捆绑savedInstanceState){
    super.onCreate(savedInstanceState);
    //通知系统,使该片段的选项菜单。}@覆盖
公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,
                         捆绑savedInstanceState){
    //充气的布局该片段
    最后查看rootView = inflater.inflate(R.layout.fragment_old_story,集装箱,FALSE);
    viewPager =(InfiniteViewPager)rootView.findViewById(R.id.pager);
    viewPager.setOffscreenPageLimit(0);
    。共享preferences = getActivity()getShared preferences(启动preferenceSETTINGS,Context.MODE_PRIVATE);
    TOTALCOUNT =共享preferences.getInt(Startup.StoryCount,4);
    storyPagerAdapter =新StoryPagerAdapter(getFragmentManager());
    PagerAdapter wrappedAdapter =新InfinitePagerAdapter(storyPagerAdapter);
    viewPager.setAdapter(wrappedAdapter);
    viewPager.setCurrentItem(TOTALCOUNT-1);    返回rootView;
}公共类StoryPagerAdapter扩展FragmentStatePagerAdapter {
    公共StoryPagerAdapter(FragmentManager FM){
        超(FM);
    }    @覆盖
    公共片段的getItem(INT位置){        返回Story.newInstance(位置+ 1);
    }    @覆盖
    公众诠释的getCount(){
        返回TOTALCOUNT;
    }
}
}

故事片段方式实现 -

  @覆盖
公共无效onCreateOptionsMenu(菜单菜单,MenuInflater气筒){    menu.clear();
    inflater.inflate(R.menu.story,菜单);
    。getActivity()getMenuInflater()膨胀(R.menu.main,菜单);
}
@覆盖
公共布尔onOptionsItemSelected(菜单项项){
    开关(item.getItemId()){
        案例R.id.Refresh:
            //我们确保了SwipeRefreshLayout正在显示它的清爽指标
            如果(!可视性){
                如果(!RefreshLayout.isRefreshing()){
                    ErrorLayout.setVisibility(View.GONE);
                    RefreshLayout.setRefreshing(真);
                }                //开始我们的刷新后台任务
                initiateRequest(今天);
            }
            返回true;        案例R.id.Share:
            // InShort =共享preferences.getString(Startup.InShort,NULL);
            Toast.makeText(的getContext(),故事,Toast.LENGTH_SHORT).show();
            如果(InShort = NULL&放大器;!&安培;!InShort.isEmpty())
            {                意图sendIntent =新意图(Intent.ACTION_SEND);
                sendIntent.putExtra(Intent.EXTRA_TEXT,喜从故事);
                sendIntent.setType(text / plain的);
                startActivity(sendIntent);
            }            返回true;        默认:
            返回super.onOptionsItemSelected(项目);
    }
}

MainActivity 用于切换片段。

 公共布尔onNavigationItemSelected(菜单项项){
    //处理导航视图项点击这里。
    displayView(item.getItemId());    返回true;
}//方法以替换content_main在ID = content_frame意见
公共无效displayView(INT viewID)
{
    片段= NULL;
    标题=的getString(R.string.app_name);    开关(viewID)
    {
        案例R.id.nav_frag0:
            片段=新OldStory();
            标题=的getString(R.string.story);
            viewIsAtHome = TRUE;
            打破;        案例R.id.nav_frag1:
            片段=新片段1();
            标题=的getString(R.string.fragment1);
            viewIsAtHome = FALSE;
            打破;        案例R.id.nav_frag2:
            片段=新Fragment2();
            标题=的getString(R.string.fragment2);
            viewIsAtHome = FALSE;
            打破;        案例R.id.nav_frag3:
            片段=新Fragment3();
            标题=的getString(R.string.fragment3);
            viewIsAtHome = FALSE;
            打破;        案例R.id.nav_frag4:
            片段=新Fragment4();
            viewIsAtHome = FALSE;
            标题=的getString(R.string.fragment4);
            打破;        案例R.id.nav_share:
            片段=新Fragment5();
            标题=的getString(R.string.fragment5);
            viewIsAtHome = FALSE;
            打破;    }    如果(片段!= NULL)
    {
        FragmentTransaction英尺= getSupportFragmentManager()调用BeginTransaction()。
        ft.replace(R.id.content_frame,片段);
        ft.commit();
    }    //设置工具栏标题
    如果(getSupportActionBar()!= NULL)
    {
        getSupportActionBar()的setTitle(职称)。
    }    DrawerLayout抽屉=(DrawerLayout)findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
}


解决方案

我不知道这是否是真正的回答你的问题,但我在你的code注意到有一个错误:

  storyPagerAdapter =新StoryPagerAdapter(getFragmentManager());

将无法正常具有因你需要使用<一个工作href=\"http://developer.android.com/reference/android/support/v4/app/Fragment.html#getChildFragmentManager%28%29\"相对=nofollow> getChildFragmentManager()到片段中管理片段。

I have implemented Navigation drawer given in the Android Studio 1.5.1.

  • I have 5 navigation drawer items with a fragment to each of them. Each Fragment has Share method (Not common).
  • Inside 1st Navigation drawer item's fragment lets say OldStory Fragment, I am having Swipe view with Viewpager consisting 3 fragments with FragmentStatePagerAdapter. It has Share method.

Problem - Share Method from Story Fragment is getting called every time even when other fragment is shown on screen. After debugging I came to know that method from Story fragment is getting called. - If I disable OldStory Fragment then everything works fine.

I am unable to solve this problem. I read so many Question/answers but they are related to Activity and Fragment methods. Please help me to solve this problem.

Note - OldStory fragment has inner class that extends FragmentStatePagerAdapter class. This class creates Many Story Fragments. Other implementation is same.

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;
    }
}
}

Story Fragment method Implementation -

@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);
    }


}

MainActivity used for switching fragments.

public boolean onNavigationItemSelected(MenuItem item) {
    // Handle navigation view item clicks here.
    displayView(item.getItemId());

    return true;
}

//method to replace Views in ID = content_frame in content_main
public void displayView(int viewID)
{
    fragment = null;
    title = getString(R.string.app_name);

    switch (viewID)
    {
        case R.id.nav_frag0:
            fragment = new OldStory();
            title = getString(R.string.story);
            viewIsAtHome = true;
            break;

        case R.id.nav_frag1:
            fragment = new Fragment1();
            title = getString(R.string.fragment1);
            viewIsAtHome = false;
            break;

        case R.id.nav_frag2:
            fragment = new Fragment2();
            title = getString(R.string.fragment2);
            viewIsAtHome = false;
            break;

        case R.id.nav_frag3:
            fragment = new Fragment3();
            title = getString(R.string.fragment3);
            viewIsAtHome = false;
            break;

        case R.id.nav_frag4:
            fragment = new Fragment4();
            viewIsAtHome = false;
            title = getString(R.string.fragment4);
            break;

        case R.id.nav_share:
            fragment = new Fragment5();
            title = getString(R.string.fragment5);
            viewIsAtHome = false;
            break;

    }

    if (fragment != null)
    {
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.replace(R.id.content_frame,fragment);
        ft.commit();
    }

    //set the toolbar title
    if(getSupportActionBar() != null)
    {
        getSupportActionBar().setTitle(title);
    }

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

解决方案

I am not sure if it is really the answer to your question, but I noticed one error in your code:

storyPagerAdapter = new StoryPagerAdapter(getFragmentManager());

will not work correctly becasuse you need to use getChildFragmentManager() to manage fragments within fragments.

这篇关于片段方法不获取调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆