1

У меня есть приложение с тремя вкладками: «Карта», «События» и «Обзоры». Я зарегистрировал данные (как показано в моем коде везде, где есть журнал), и происходит следующееAndroid-swipe tabs viewpager issue

я запустить приложение и он открывается на вкладке 'Map' журнал однако, показывает

02-14 05:.. 37: 56,240: D/curent вкладка позиции (1787): 0 02-14 05: 37: 56.260: D/arg0 (1787): 0 02-14 05: 37: 56.260: выбранный D/tab (1787): MapFragment 02-14 05: 37: 56.260: D/arg0 (1787): 1 02-14 05: 37: 56.260: выбран D/tab (1787): список_Of_EventsFragment

Я нажимаю на вкладку «События» (вторая вкладка на панели действий), и фрагмент событий отображается просто отлично. Но журнал показывает следующее, а также показывает обработку JSON, которая НЕ является частью фрагмента «События». он закодирован в фрагменте «Обзоры». Таким образом, он по-прежнему показывает List_Of_EventsFragment еще в фоновом режиме свою загрузку ReviewsListFragment.

02-14 05: 38: 37,890 D/arg0 (1787): 2 02-14 05: 38: 37,890 D/вкладка выбрана (1787): ReviewsListFragment 02-14 05: 38: 37.910: D/позиция текущей позиции (1787): 1 02-14 05: 38: 37.910: D/позиция текущего положения (1787): 1

Как вы можете видеть, позиция «текущая позиция страницы» и «текущая позиция табуляции» 'являются правильными. Они отображают 0,1,2 с уважением для каждой вкладки. Проблема, похоже, заключается в «arg0». Я попытался изменить свои операторы if на «if (arg0 == 1)» вместо «(если arg0 == 0)» и т. Д. Это не сработало, поскольку оно вызвало исключение nullpointerException. Кажется, когда приложение загружается, arg0 равно 0, а затем 1 сразу после, хотя фрагмент «Карта» открыт и ничего не было нажато.

package com.example.eventmapapp; 

import android.os.Bundle; 
import android.app.ActionBar; 
import android.app.ActionBar.Tab; 
import android.app.ActionBar.TabListener; 
import android.app.FragmentTransaction; 
import android.util.Log; 
import android.view.Menu; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 
import android.support.v4.view.ViewPager; 

public class FrontPage extends FragmentActivity implements TabListener{ 

ActionBar actionbar; 
ViewPager viewpager; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_front_page); 

    viewpager =(ViewPager) findViewById(R.id.pager); 
    viewpager.setAdapter(new MyAdapter(getSupportFragmentManager())); 
    viewpager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 

     @Override 
     public void onPageSelected(int arg0) { 
      // TODO Auto-generated method stub 
      actionbar.setSelectedNavigationItem(arg0); 
      Log.d("current page position", arg0 + ""); 
     } 

     @Override 
     public void onPageScrolled(int arg0, float arg1, int arg2) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onPageScrollStateChanged(int arg0) { 
      // TODO Auto-generated method stub 

     } 
    }); 


    actionbar = getActionBar(); 
    actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

    ActionBar.Tab tab1 = actionbar.newTab(); 
    tab1.setText("Map"); 
    tab1.setTabListener(this); 

    ActionBar.Tab tab2 = actionbar.newTab(); 
    tab2.setText("Events"); 
    tab2.setTabListener(this); 

    ActionBar.Tab tab3 = actionbar.newTab(); 
    tab3.setText("Reviews"); 
    tab3.setTabListener(this); 

    actionbar.addTab(tab1); 
    actionbar.addTab(tab2); 
    actionbar.addTab(tab3); 
} 




@Override 
public void onTabReselected(Tab tab, FragmentTransaction ft) { 
    // TODO Auto-generated method stub 
} 




@Override 
public void onTabSelected(Tab tab, FragmentTransaction ft) { 
    // TODO Auto-generated method stub 
    viewpager.setCurrentItem(tab.getPosition()); 
    Log.d("current tab position", tab.getPosition() + ""); 
} 




@Override 
public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
    // TODO Auto-generated method stub 
} 

class MyAdapter extends FragmentPagerAdapter 
{ 

    public MyAdapter(FragmentManager fm) { 
     super(fm); 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public Fragment getItem(int arg0) { 
     Fragment fragment = null; 

     Log.d("arg0", arg0 + ""); 
     if (arg0==0)     //|| arg0==1 
     { 
      fragment = new MapFragment(); 
      Log.d("tab chosen", "MapFragment"); 
     } else 
     if (arg0==1) 
     { 
      fragment = new List_Of_EventsFragment(); 
      Log.d("tab chosen", "List_Of_EventsFragment"); 
     } else 
     if (arg0==2) 
     { 
      fragment = new ReviewsListFragment(); 
      Log.d("tab chosen", "ReviewsListFragment"); 
     } 
     return fragment; 
    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return 3; 
    } 






} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.front_page, menu); 
    return true; 
} 
} 

ответ

1

Это довольно нормально. Когда вы загружаете вкладку, она загружает вкладки до и после нее и уничтожает другие вкладки, и это полностью контролируется самим ViewPager. Это называется предварительной загрузкой представления, чтобы показать лучшее сглаживание, пока вы просматриваете свои взгляды.

+0

спасибо. мой эмулятор продолжал замерзать, хотя это может быть еще одна проблема только с моим эмулятором. по телефону, я тестировал и работает отлично. –

+0

на моей третьей вкладке, он использует php и json. поэтому, когда вторая вкладка открыта, она уже подключается к Интернету и загружает данные json. так это нормально? С этим можно было подумать, что что-то подозрительное. –

+0

в любом случае он работает над самим телефоном, и спасибо за ваш комментарий :) Я думаю, я помечаю это как выполненное :) спасибо alot :) –