2015-12-21 40 views
0

我已經實現在Android Studio 1.5.1給出抽屜式導航片段的方法沒有得到所謂的

  • 我有5個導航抽屜項目與他們每個人的片段。每個片段都有共享方法(不常用)。
  • 裏面第一個抽屜式導航項目的片段讓說OldStory片段,我有Viewpager由3場片段,片段FragmentStatePagerAdapter刷卡視圖。它有Share方法。

問題 - 共享的方法從故事片段獲取調用即使其他片段顯示在屏幕上每一次。調試後我才知道從的方法故事片段正在調用。 - 如果我禁用了OldStory Fragment,那麼一切正常。

我無法解決這個問題。我閱讀了很多問題/答案,但它們與活動和片段方法有關。請幫我解決這個問題。

- OldStory片段具有延伸FragmentStatePagerAdapter類內部類。本課創建了許多故事片段。其他的實現是一樣的。

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

故事片段方法實施 - 用於切換片段

@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

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); 
} 
+0

你可以添加如何初始化和切換片段的代碼?我是對的,問題是一旦你通過NavigationDrawer切換到另一個片段,嵌套在ViewPager片段中仍然會得到'onOptionsItemSelected'調用? –

+0

到目前爲止,它看起來像你面臨同樣的問題,在這裏:http://stackoverflow.com/a/34401646/1658267雖然,它會很高興有更多的上下文,以確保 –

+0

還有一件事 - 你怎麼使用'setHasOptionsMenu()'工作? –

回答

1

我不知道這是否是真正的回答你的問題,而是我在你的代碼注意到了一個錯誤:

具有因你需要使用 getChildFragmentManager()到片段中管理片段
storyPagerAdapter = new StoryPagerAdapter(getFragmentManager()); 

將無法​​正常工作。

+0

非常愚蠢的錯誤。有效。謝謝。 – Roon13

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類在FragmentA(我使用內部ViewPager的一個):

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

讓我知道,如果我正確理解你的問題!

無論如何,我希望它有幫助。

+0

其實確切的問題以及這個問題在這裏:http://stackoverflow.com/questions/34349728/duplicate-menu-and-data-in-fragments-after-using-fragmentstatepageradapter – Roon13

+0

@ Roon13我不明白。我的例子中沒有菜單重複? (即使我將'PagerAdapter'從'FragmentPagerAdapter'更改爲'FragmentStatePagerAdapter') –

+0

雅但我有相同的實現該問題。這就是爲什麼我很難理解。 – Roon13

相關問題