片段未在 viewpager 中更新
Fragments not updating in viewpager
我对 android 的 ViewPager 和适配器世界还很陌生。我看到这个问题被问过很多次但不太明白所以希望得到一个简单的答案:)。
我有一个带有 3 个选项卡的 ViewPager,每个选项卡都有一个片段。默认情况下,用户首先会看到 tab2,他会在其中输入一些内容以生成字符串。然后需要将该字符串放入 tab3 中,从中生成一个二维码。
选项卡 2 中的字符串更新为 class,选项卡 3 从那里获取字符串。
我的问题是,当我从 tab2->tab3 移动时,没有生成二维码。但是当我去 tab2->tab1->tab3 时它被生成了。我猜它保留了我的旧片段。
下面是我的 class 代码。你能告诉我为什么这个 viewpager 行为如此吗?
我的 FragementActivity class:
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;
}
}
当您当前位于第二个标签页时。第一个和第三个选项卡是预加载的(因为动画更流畅)。当您切换到第一个选项卡时,第三个选项卡将被卸载 -> 因此在切换回第三个选项卡后,它会被重新创建并为您工作。
CreateView 的第三个选项卡在第二个选项卡完成之前被调用,这就是它不起作用的原因。尝试在 onResume() 内部实现逻辑 - 以确保当焦点回到片段上时它总是被调用。
希望这对您有所帮助...
干杯
在 ConfigExchangeMain class 中:
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) {
}
}
}
我对 android 的 ViewPager 和适配器世界还很陌生。我看到这个问题被问过很多次但不太明白所以希望得到一个简单的答案:)。
我有一个带有 3 个选项卡的 ViewPager,每个选项卡都有一个片段。默认情况下,用户首先会看到 tab2,他会在其中输入一些内容以生成字符串。然后需要将该字符串放入 tab3 中,从中生成一个二维码。
选项卡 2 中的字符串更新为 class,选项卡 3 从那里获取字符串。
我的问题是,当我从 tab2->tab3 移动时,没有生成二维码。但是当我去 tab2->tab1->tab3 时它被生成了。我猜它保留了我的旧片段。
下面是我的 class 代码。你能告诉我为什么这个 viewpager 行为如此吗?
我的 FragementActivity class:
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;
}
}
当您当前位于第二个标签页时。第一个和第三个选项卡是预加载的(因为动画更流畅)。当您切换到第一个选项卡时,第三个选项卡将被卸载 -> 因此在切换回第三个选项卡后,它会被重新创建并为您工作。
CreateView 的第三个选项卡在第二个选项卡完成之前被调用,这就是它不起作用的原因。尝试在 onResume() 内部实现逻辑 - 以确保当焦点回到片段上时它总是被调用。
希望这对您有所帮助... 干杯
在 ConfigExchangeMain class 中:
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) {
}
}
}