0

Я использую в своем приложении SlidingTabLayout (из источников Google), чтобы перемещаться между различными фрагментами. Я могу провести между содержимым просто отлично, но проблема, с которой я столкнулся, - это название панели действий, которая действует странно.SlidingTabLayout и название панели действий

Предположим, что у меня есть две вкладки с двумя названиями («First Title» и «Второй Название»):

| Action bar  | 

| First Title | Second Title | 

Когда я первый ввести фрагмент, содержащий SlidingTabLayout, название ActionBar, как это :

| Firs...  | 

| First Title | Second Title | 

Когда я салфетки (на второй закладке, например), название ActionBar становится:

| Second Title  | 

| First Title | Second Title | 

И остается так. Кажется, что Actionbar принимает заголовок последнего загруженного Фрагмента, когда я прокручиваю хотя бы один раз.

То, что я хочу это:

Я хочу, чтобы показать «Main Title» в ActionBar, что никогда не меняется, независимо от того, что название в SlidingTabLayout есть.

Вот некоторые части моего кода:

** Фрагмент, содержащий SlidingTabLayout:

private String mainTitle; 
.... 

@Override 
public void onCreate(Bundle savedInstance) { 
    super.onCreate(savedInstance); 

    // The mainTitle is given to this fragment by another fragment 
    Bundle args = getArguments(); 
    if (args != null) { 
     mainTitle = args.getString("TITLE"); 
    } 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.layout, container, false); 
    mViewPager = (ViewPager) rootView.findViewById(R.id.viewpager); 
    mSlidingLayout = (SlidingTabLayout) rootView.findViewById(R.id.sliding_layout); 
    List<Fragment> listFragments = new ArrayList<>(); 
    List<String> listTitles = new ArrayList<>(); 
    for (int i = 0; i < mSize; i++) { 
     Bundle bundle = new Bundle(); 
     .... 
     listFragments.add(Fragment.instanciate(getActivity(), CustomFragment.class.getName(), bundle)); 
     listTitles.add("..."); 
    } 
    mViewPager.setAdapter(new PagerAdapter(getChildFragmentManager(), listFragments, listTitles)); 

    mSlidingLayout.setDistributedEvenly(true); 
    mSlidingLayout.setViewPager(mViewPager); 

    return rootView; 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    // I TRY TO SET THE TITLE HERE !! 
    getActivity().getSupportActionBar().setTitle(mainTitle); 
} 

** Адаптер:

class PagerAdapter extends FragmentPagerAdapter { 
    List<Fragment> fragments; 
    List<String> titles; 
    ... 
    @Override 
    public Fragment getItem(int position) { 
     Fragment fragment = fragments.get(position); 
     return fragment; 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     // maybe the problem is in this method. 
     // this method is supposed to provide the titles for the tab 
     // but maybe it's also changing the actionbar title 
     return titles.get(position); 
} 

Я устанавливаю титул ActionBar в методе onResume каждый раз, когда я вхожу в фрагмент.

Спасибо!

EDIT 1:

Я попытался с помощью нового SlidingTabLayout, который я получил от Google I/O, а результат все тот же!

Похоже, что название в ActionBar является подсказкой вначале, а затем оно изменяется на последний загруженный фрагмент, когда я прокручиваю другой фрагмент.

Это как загрузочный фрагмент, и каждый раз, когда фрагмент загружается, заголовок в ActionBar переопределяется заголовком этого фрагмента.

EDIT 2:

Я изменил код, чтобы опубликовать последнюю версию этого (я использую сейчас SlidingTabLayout) и показать, как я получу свой mainTitle.

+0

Что произойдет Если вы сократите свой первый заголовок? – Fadils

+0

То же самое, я не думаю, что это проблема длины заголовка, так как она показывает «Второе название», когда я сажусь на другой фрагмент. –

+0

Почему вы не устанавливаете заголовок в onCreate Activity? – NasaGeek

ответ

0

Нашел!

Это было действительно немым меня (это объясняет, почему другие не имеют эту проблему)

Я садился название также в каждом из фрагментов (даже те, которые содержатся в Tabs), поэтому, когда я стащила , был вызван onResume на тех фрагментах, и он изменил название в ActionBar ...

Спасибо всем за помощь, я ценю это!

1

вы можете использовать ниже код работает отлично для меня

public class MatchesActivity extends AppCompatActivity implements ActionBar.TabListener { 

SectionsPagerAdapter mSectionsPagerAdapter; 
ViewPager mViewPager; 
FloatingActionButton skipButton; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_matches); 
    final ActionBar actionBar = getSupportActionBar(); 
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
    actionBar.setDisplayHomeAsUpEnabled(true); 
    actionBar.setDisplayShowHomeEnabled(true); 
    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); 
    // Set up the ViewPager with the sections adapter. 
    mViewPager = (ViewPager) findViewById(R.id.pager); 
    skipButton = (FloatingActionButton) findViewById(R.id.skip_next); 
    skipButton.setVisibility(View.GONE); 
    mViewPager.setAdapter(mSectionsPagerAdapter); 
    mViewPager.setOffscreenPageLimit(1); 
    mViewPager.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View view, MotionEvent motionEvent) { 
      return false; 
     } 
    }); 
    mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
     @Override 
     public void onPageSelected(int position) { 
      actionBar.setSelectedNavigationItem(position); 
     } 
    }); 

    actionBar.addTab(
      actionBar.newTab().setText("MATCHES") 
        .setTabListener(this)); 
    actionBar.addTab(
      actionBar.newTab().setText("PINS") 
        .setTabListener(this)); 
    actionBar.addTab(
      actionBar.newTab().setText("CHATS") 
        .setTabListener(this)); 
} 

@Override 
public void onBackPressed() { 
    startActivity(new Intent(MatchesActivity.this, MainActivity.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK & Intent.FLAG_ACTIVITY_CLEAR_TOP)); 
    MatchesActivity.this.finish(); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    int id = item.getItemId(); 
    if (id == android.R.id.home) { 
     onBackPressed(); 
    } 
    return super.onOptionsItemSelected(item); 
} 

@Override 
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 
    mViewPager.setCurrentItem(tab.getPosition()); 
} 

@Override 
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 
} 

@Override 
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 
} 

public class SectionsPagerAdapter extends FragmentStatePagerAdapter { 

    public SectionsPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     switch (position) { 
      case 0: 
       return new MatchesFragment(); 
      case 1: 
       return new PinsFragment(); 
      case 2: 
       return new ConversationFragment(); 
      default: 
       return new MatchesFragment(); 
     } 
    } 

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

    @Override 
    public CharSequence getPageTitle(int position) { 
     Locale l = Locale.getDefault(); 
     switch (position) { 
      case 0: 
       return getString(R.string.title_section1).toUpperCase(l); 
      case 1: 
       return getString(R.string.title_section2).toUpperCase(l); 
      case 2: 
       return getString(R.string.title_section3).toUpperCase(l); 
     } 
     return null; 
    } 
} 

}

+0

Я использую 'PagerAdapter' и' SlidingTabLayout' в фрагменте (а не в действии). Это будет немного сложно изменить все это ... –

1

Я отправляю здесь код mine.It работал me.make необходимые изменения в ней и попробовать it.i в нем была использована библиотека PagerSlidingTabStrip.

public class DealFragment extends Fragment { 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View view= inflater.inflate(R.layout.fragment_deal, container, false); 
    ViewPager viewPager = (ViewPager) view.findViewById(R.id.viewpager); 
    viewPager.setAdapter(new SampleFragmentPagerAdapter(getChildFragmentManager())); 
    PagerSlidingTabStrip tabsStrip = (PagerSlidingTabStrip)view.findViewById(R.id.tabs); 
    tabsStrip.setBackgroundColor(Color.parseColor("#333333")); 
    // Attach the view pager to the tab strip 
    tabsStrip.setViewPager(viewPager); 
    return view; 
} 
public class SampleFragmentPagerAdapter extends FragmentPagerAdapter { 
    final int PAGE_COUNT = 2; 
    private final String tabTitles[] = new String[] { "Today's Deals", "Deals Close By" }; 

    public SampleFragmentPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

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

    @Override 
    public android.support.v4.app.Fragment getItem(int position) { 
     if(position==0) 
     { 
      return new TodaysDeal(); 
     } 
     else 
     { 
      return new DealsCloseBy(); 
     } 

    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     // Generate title based on item position 
     return tabTitles[position]; 
    } 
} 

}

надеюсь, что это может помочь вам.

+0

Спасибо Animesh, но я не вижу, где вы задали название ActionBar. Я вижу только, где вы устанавливаете заголовки вкладок. –

+0

это не будет выглядеть как ActionBar, оно появится под панелью действий в виде tabView, ActionBar или ToolBar, не имеет значения. и для имени ActionBar вам не обязательно указывать здесь. Оно основано на имени Activity, которое вы указываете в файле manifest.xml вашего приложения. –

+0

Ну, на самом деле проблема заключается в названии в ** ActionBar **. В моем приложении название ActionBar устанавливается в методе «onResume» фрагментов. Таким образом, заголовок меняется каждый раз, когда мы вводим новый фрагмент, и не указывается в манифесте. И это название, которое изменяется странно, когда я использую фрагмент с вкладками ... –

1

Название actionBar не изменяется, потому что onResume() не называется временем, когда вы прокручиваете назад.

Это потому, что ViewPager не вызывает фрагмент onResume во второй раз. Хотя в действительности фрагмент возобновляется.

Что вы можете сделать, это переместить настройку заголовка вашего действия в родительский фрагмент (который содержит pagertabstrip) вместо onCreateView.

Для справки:

** Фрагмент, содержащий PagerTabStrip:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.layout, container, false); 
    mViewPager = (ViewPager) rootView.findViewById(R.id.viewpager); 

    List<Fragment> listFragments = new ArrayList<>(); 
    List<String> listTitles = new ArrayList<>(); 

    ... 

    // HERE's what you want 
    final ActionBar actionBar = getActivity().getSupportActionBar(); 
    if (actionBar != null) { 
     actionBar.setTitle(R.string.main_title); 
    } 

    mViewPager.setAdapter(new PagerAdapter(getChildFragmentManager(), listFragments)); 

    return rootView; 
} 
+0

Спасибо Fadils, но он все еще не работает ... ** Кажется, заголовок Actionbar переопределяется последним фрагментом, загруженным в PagerAdapter ** –

+0

Как вы получаете свой основной титул? Вы установили заголовок со строковым ресурсом, как указано выше? – Fadils

+0

Название указано как объект «String» для фрагмента из другого фрагмента. Итак, я не использую идентификатор ресурса, так как основное название может меняться –

Смежные вопросы