0

我對Android中的ViewPager和適配器世界很新穎。我看過這個問題很多次,但不太明白,所以希望得到一個簡單的答案:)。在viewpager中不更新的片段

我有一個ViewPager有3個選項卡,每個選項卡都有一個片段。默認情況下,用戶首先看到tab2,在那裏他提供了一些輸入來生成一個字符串。這個字符串需要在tab3中生成一個qr代碼。

來自標籤2的字符串更新爲類,並且tab3從那裏接收字符串。

我的問題是,當我從tab2-> tab3移動qr代碼不會生成。但是當我去tab2-> tab1-> tab3它被生成。我猜測它保留了我的舊片段。

以下是我的班級代碼。請讓我知道爲什麼這個viewpager行爲如此。

我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,它的工作,必須與keyvalue thingi一起玩,因爲這是我的共享首選項,但是,是的,您選擇選項卡時調用更新的解決方案確實完美地工作。也接受了你的回答,再次感謝 –

0

當你當前在第二個標籤。第一個和第三個標籤預加載(因爲動畫更平滑)。當你切換到第一個選項卡時,第三個選項卡被卸載 - >所以在切換回第三個選項卡後,它將被重新創建並且適用於您。

第三個選項卡onCreateView在第二個選項卡完成之前調用,這就是爲什麼它不工作。嘗試在onResume()內部實現邏輯 - 確保在焦點返回片段時始終調用它。

希望這有助於... 乾杯

+0

試了一下,我試圖在FragmentActivity和t中的onPageSelected方法中獲取位置母雞調用onResume(),仍然一樣:( –

+0

nono你永遠不應該調用生命週期方法(onResume onStart等),他們從系統調用,我說的是:執行/覆蓋ConfigExchangeQR片段的onResume和在那裏添加邏輯來創建你的QR代碼。 (檢查字符串是否可用嘗試創建qr代碼) – Patric