2013-10-11 3 views
0

Я написал FragmentActivity с ViewPager, я не хотел использовать панель действий для вкладок (потому что я не хотел, чтобы вкладки располагались над меню), а также не PagerTabStrip решение, потому что я не мог настроить его так, как я хотел.ViewPager & tabs: Задержка после нажатия вкладки

так я написал собственный LinearLayout как закладки контейнера:

<LinearLayout 
    android:id="@+id/main_tabs" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@color/white" 
    android:orientation="horizontal" > 
</LinearLayout> 

с View.OnClickListener для каждого из каждой вкладки

OnClickListener onClickListener = new View.OnClickListener() { 
     @Override 
     public void onClick(final View view) { 
      mapTabs.get(lastSelectedTab).setSelected(false); 
      view.setSelected(true); 

      Runnable runnable = new Runnable() {      
       @Override 
       public void run() { 
        int index = Integer.parseInt(view.getTag().toString()); 
        FragmentActivity.setTab(index); 
        lastSelectedTab = index; 
       } 
      }; 
      handler.post(runnable);     
     } 
    }; 
} 



public static void setTab(int index) {  
    FragmentActivity.viewPager.setCurrentItem(index, true); // true or false does not make any difference 
} 

это метод я написал, чтобы добавить отдельные вкладки в контейнер тары (main_tabs):

private void addTab(LayoutInflater inflater, ViewGroup tabs, int imageId, View.OnClickListener onClickListener) { 
    inflater.inflate(R.layout.main_tab, tabs); 
    int index = tabs.getChildCount() - 1; 
    ImageView ivTab = (ImageView) tabs.getChildAt(index); 
    ivTab.setTag(String.valueOf(index)); // stored the tab index 
    ivTab.setImageResource(imageId); 
    ivTab.setOnClickListener(onClickListener); 
    mapTabs.put(index, ivTab); // add an imageview to the tab 
} 

Я использовал runnalbe, чтобы я увидел выделение вкладку немедленно, а не после небольшой задержки при появлении новой страницы. Я также сохранил последнюю выбранную вкладку, чтобы отменить ее при выборе нового.

Я сохраняю все вкладки на карте, чтобы получить к ним доступ позже.

это OnPageChangeListener я написал (чтобы выделить вкладку, связанную):

viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 

     @Override 
     public void onPageSelected(int position) {    
      mapTabs.get(position).setSelected(true); // selected the tag asociated with the current visible page 
      mapTabs.get(lastSelectedTab).setSelected(false); // deselectes the last selected tab 
      lastSelectedTab = position; 
      ListFragment<?> item = FragmentActivity.fragmentAdapter.getItem(position); 
      setTitle(item.getTitle());   
     } 

     @Override 
     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 
     } 

     @Override 
     public void onPageScrollStateChanged(int state) { 

     } 
    }); 

все работает отлично, я просто не ясно, о производительности:

, когда я перейти к следующей странице, все идет очень быстро и плавно. следующая страница появляется сразу же без каких-либо проблем; только небольшое меню в панели действий (созданное в модуле onCreateOptionsMenu (меню меню, надувной модуль MenuInflater) каждого фрагмента) появляется с небольшой задержкой (около 500-700 мс).

но когда я нажимаю на одну из вкладок, выбранная страница появляется не сразу, а с небольшой задержкой (на самом деле то же самое время, когда меню должно появляться, как указано выше: меню и страница отображаются вместе одновременно). bzw. это происходит также, когда я использую решение tabstrip.

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

но что я делаю неправильно? и есть ли возможность, чтобы меню отображалось сразу же, как и страницы при прокрутке? могут ли различные меню не кэшироваться так же, как страницы?

ответ

4

решение было очень простым. я просто должен был сохранить все свои 4 вкладки в ViewPager, чтобы им не нужно было воссоздавать (и, следовательно, не вызывать короткую задержку после каждого нажатия табуляции). Мне просто пришлось добавить следующие строки в метод onCreate.

viewPager = (ViewPager) findViewById(R.id.pager); 
viewPager.setOffscreenPageLimit(4); 
0

попробовать этот

myViewPager.animate().translationX(0f).setDuration(1000); 

где 1000 является задержка в миллисекундах

+0

благодарит за информацию.Я попробовал, но это не помогло. даже время 5000 по причинам тестирования ничего не изменило. во всяком случае, иногда он изменяется плавно, иногда вроде перезагружается (также иногда вызывается метод onActivityCreated для страниц, а иногда и нет). – richard

+0

теперь я поместил вашу строку в метод onClick и изменил ее так: viewPager.animate(). ПереводX (индекс * iPageWidth * -1) .setDuration (1000); , но он переместил всю страницу со всеми ее вкладками и не сколтил одну страницу – richard

+0

гладкость анимации отличается от эмулятора, проверяет реальное устройство и реализует viewPager.animate(). TranslateX (0f) .setDuration (1000) ; в методе onPageChangeListner и сделать viewPager окончательным. –

1

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

pager.setOffscreenPageLimit (4);

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