0

Я довольно новичок в ViewPager и мире адаптеров в android. Я видел эту проблему много раз, но не совсем понял, поэтому надеюсь на упрощенный ответ :).Фрагменты, не обновляющиеся в viewpager

У меня есть ViewPager с 3 вкладками, и каждая вкладка имеет фрагмент. По умолчанию пользователь сначала видит tab2, где он дает некоторый imput, чтобы сгенерировать строку. эта строка затем должна быть взята в tab3, которая генерирует из нее код qr.

строка из вкладки 2 обновляется до класса, а tab3 берет строку оттуда.

Моя проблема в том, что когда я перехожу от tab2-> tab3, код qr не генерируется. Но когда я иду tab2-> tab1-> tab3, он генерируется. Я предполагаю, что он сохраняет мой старый фрагмент.

Ниже приведены мои коды классов. Не могли бы вы сообщить мне, почему это поведение в этом представлении.

мой класс FragementActivity:

public class ConfigExchangeMain extends FragmentActivity { 

FragmentPagerAdapter adapterViewPager; 
SampleFragementPagerAdapterExchange adapter; 
String sent; 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.config_exchange_main); 

    final ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager); 

    adapter=new SampleFragementPagerAdapterExchange(getSupportFragmentManager()); 

    viewPager.setAdapter(adapter); 
    viewPager.setCurrentItem(1); 

    // Give the TabLayout the ViewPager 
    TabLayout tabLayout = (TabLayout) findViewById(R.id.sliding_tabs); 
    tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); 
    tabLayout.setupWithViewPager(viewPager); 

    } 
} 

Мой Пейджер адаптер выглядит

public class SampleFragementPagerAdapterExchange extends FragmentStatePagerAdapter { 

final int PAGE_COUNT = 3; 
private String tabTitles[] = new String[]{"CONTACTS", "HOME", "QR+SCAN"}; 
private ConfigDetail context; 

public SampleFragementPagerAdapterExchange(FragmentManager fm) { 
    super(fm); 
    //this.context = context; 
} 

@Override 
public Fragment getItem(int position) { 
    switch (position) { 
     case 1: 
      return new ConfigExchangeNFR(); 
     case 0: 
      return new ConfigExchangeHome(); 
     case 2: 
      return new ConfigExchangeQR(); 
     default: 
      return new ConfigExchangeQR(); 
    } 
} 

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

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

@Override 
public int getItemPosition(Object object) { 


    return POSITION_NONE; 


} 
} 

и мой фрагмент в TAB3, не обновляя:

public class ConfigExchangeQR extends Fragment { 

ImageView iQRCode ; 
int iQRDimension; 
Button bScan; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    FacebookSdk.sdkInitialize(getActivity().getApplicationContext()); 

    View view1 = inflater.inflate(R.layout.config_exchange_qr, container, false); 

    iQRCode = (ImageView)view1.findViewById(R.id.qrCode); 

    iQRDimension = 900; 

    String FinalQRCode = KeyValueDb.getPrefFinalVCard(getActivity()); 
    QRCodeEncoder qrCodeEncoder = new QRCodeEncoder(FinalQRCode, null, 
      contents.Type.TEXT, BarcodeFormat.QR_CODE.toString(), iQRDimension); 





     try { 
      Bitmap bitmap = qrCodeEncoder.encodeAsBitmap(); 
      iQRCode.setImageBitmap(bitmap); 
     } catch (WriterException e) { 
      e.printStackTrace(); 
     } 

    bScan = (Button)view1.findViewById(R.id.scan_qr); 
    bScan.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View paramAnonymousView) { 

      Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); 
      startActivityForResult(intent, 0); 

     } 
    }); 


    return view1; 


} 
} 

ответ

2

В ConfigExchangeMain Класс:

viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
     @Override 
     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {   
     } 

     @Override 
     public void onPageSelected(int position) { 

     Fragment fragment= adapter.getItem(position); 

      if(fragment instanceof ConfigExchangeQR){ 
      ((ConfigExchangeQR)fragment).update(); 
      } 

     } 

     @Override 
     public void onPageScrollStateChanged(int state) { 
     } 
    }); 


    @Override 
public void onDestroy() { 
    super.onDestroy(); 
    viewPager.clearOnPageChangeListeners(); 
} 

Добавить этот метод в ваш ConfigExchangeQR фрагмента

public class ConfigExchangeQR extends Fragment { 
     ... 
    public void update(){ 

     String FinalQRCode = KeyValueDb.getPrefFinalVCard(getActivity()); 
     QRCodeEncoder qrCodeEncoder = new QRCodeEncoder(FinalQRCode, null, 
     contents.Type.TEXT, BarcodeFormat.QR_CODE.toString(), iQRDimension); 


     try { 

     Bitmap bitmap = qrCodeEncoder.encodeAsBitmap(); 
     iQRCode.setImageBitmap(bitmap); 

     } catch (WriterException e) { 

     } 



    } 
} 
+0

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

0

Когда вы в настоящее время в вашем вторая вкладка. Первая и третья вкладки предварительно загружены (поскольку анимация более плавная). Когда вы переключаетесь на первую вкладку, третья вкладка выгружается -> поэтому после перехода на третью вкладку она воссоздается и работает для вас.

3-я вкладка onCreateView вызывается до выполнения второй вкладки, поэтому она не работает. Попробуйте реализовать логику внутри onResume() - чтобы убедиться, что она всегда вызывается, когда фокус возвращается к фрагменту.

Надеется, что это помогает ... Приветствия

+0

пробовал, я пытался получить позицию в методе onPageSelected в FragmentActivity и t курите вызов onResume(), все равно то же самое :( –

+0

nono вы никогда не должны вызывать методы жизненного цикла (onResume onStart ect.), которые они вызывают из системы, что я говорю: реализовать/переопределить onResume вашего фрагмента ConfigExchangeQR и добавьте логику для создания кода qr. (Проверьте, существует ли String, попытайтесь создать qr-код) – Patric

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