我有以下问题..在我的应用程序中,我有一个活动应该显示用户的每个 ProfilePictures + 一个额外的片段以添加新图片。
什么工作:我有 Fragment 活动与 Fragment 和 StatePagerAdapter;
片段:公共类 ScreenSlidePageFragment 扩展片段{
final static int RESULT_LOAD_IMAGE = 2;
ArrayList<String> test = new ArrayList<String>();
Bitmap profilePic;
ImageView imgView;
UserProfilePub_viewpager actRef;
Bitmap bitmap;
int pos;
ArrayList<Bitmap> bitmaps = new ArrayList<Bitmap>();
public ScreenSlidePageFragment newInstance(Bitmap profilePic, ArrayList<Bitmap> bitmaps, int pos){
this.bitmaps = bitmaps;
this.profilePic = profilePic;
this.pos = pos;
ScreenSlidePageFragment f = new ScreenSlidePageFragment();
Bundle bdl = new Bundle();
bdl.putParcelableArrayList("profilePics", bitmaps);
bdl.putInt("pos", pos);
bdl.putParcelable("profilePic", profilePic);
f.setArguments(bdl);
return f;
}
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle saveInstanceState){
ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_screen_slide_page, container, false);
imgView = (ImageView) rootView.findViewById(R.id.up_pub_iv_viewpager);
if(getArguments().getInt("pos") == 0){
imgView.setImageBitmap((Bitmap) getArguments().getParcelable("profilePic"));
}else{
int position = getArguments().getInt("pos");
bitmaps = getArguments().getParcelableArrayList("profilePics");
if(bitmaps.get(position) != null)
imgView.setImageBitmap((Bitmap) getArgumentsbitmaps.get(position);
imgView.setOnLongClickListener(new OnLongClickListener(){
@Override
public boolean onLongClick(View arg0) {
loadPic(imgView);
return false;
}
});
//}
}
return rootView;
}
public void loadPic(ImageView imgView){
Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, RESULT_LOAD_IMAGE);
}
}
所以,现在,在开始活动之前下载的主 UserProfilePic 只显示在第一个片段中,另一个额外的 UserProfilePics 应该显示在其余片段中..如果带有图片的数组为空,最后一个片段应该与添加新图片的选项一起添加......但这现在并不重要......所以,现在我有一个带有主要用户图片的片段和一个可以添加新图片的片段......通过OnLongClick 手机中的图库被调用并可以设置新图片。
FragmentActivity + 适配器:
public class UserProfilePub_viewpager extends FragmentActivity {
ArrayList<Bitmap> pics = new ArrayList<Bitmap>();
UserProfilePub_viewpager actRef;
String url="***************************";
Bitmap profilePic;
int pos;
private static final int NUM_PAGES = 2;
private ViewPager mPager;
private PagerAdapter mPagerAdapter;
ImageView imgView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.viewpager_layout_activity);
Intent intent = getIntent();
String USID = intent.getExtras().getString("USID");
profilePic = intent.getExtras().getParcelable("profilePic");
pics = intent.getParcelableArrayListExtra("profilePics");
ArrayList<NameValuePair> nameValuePair = new ArrayList<NameValuePair>();
nameValuePair.add(new BasicNameValuePair("USID", USID));
mPager = (ViewPager) findViewById(R.id.pager);
mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager(), profilePic, pics);
mPager.setAdapter(mPagerAdapter);
}
public void onBackPressed(){
if(mPager.getCurrentItem() == 0){
super.onBackPressed();
}else{
mPager.setCurrentItem(mPager.getCurrentItem() - 1);
}
}
public static class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter{
ArrayList<Bitmap> pics = new ArrayList<Bitmap>();
Bitmap profilePic;
public ScreenSlidePagerAdapter(FragmentManager fm, Bitmap profilePic, ArrayList<Bitmap> pics) {
super(fm);
this.pics = pics;
this.profilePic = profilePic;
}
@Override
public Fragment getItem(int pos){
return new ScreenSlidePageFragment().newInstance(profilePic, pics, pos);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return NUM_PAGES;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.user_profile_pub_viewpager, menu);
return true;
}
protected void onActivityResult(int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode, resultCode, data);
int RESULT_LOAD_IMAGE = 2;
if(requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data){
int vID = data.getExtras().getInt("vID");
imgView = (ImageView) findViewById(vID);
Uri selectedImage = data.getData();
String[] filePathColumn = {MediaStore.Images.Media.DATA};
Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String picturePath = cursor.getString(columnIndex);
cursor.close();
decodeBitmap decBit = new decodeBitmap(picturePath, imgView);
decBit.execute();
}
}
public void savePic(Bitmap bitmap){
pics.add(bitmap);
}
decodeBitmap 是一个异步任务,其中从图库中选择的图片被调用..在 onPostExecute 方法中,他调用“savePic”...在最后一种方法中,我想在第二个现有的片段中添加一个新片段最后一个地方,应该显示选定的图像。但是我不知道如何添加新的 Fragment..我尝试使用 FragmentTransaction,但这不起作用..我认为是因为我使用了适配器..有人可以帮助我吗?至少只是在我应该思考的方向或某事上的小费...... =(
------我自己的答案------
我已经尝试通过 FragmentTransaction 更新 viewpager ..但它不起作用...我想我必须通过适配器来做...我已经尝试过这样做...它也可以工作..但是可悲的是根本没有..当我想取回在画廊意图中选择的图片时,图片被异步任务解码,这会从片段活动中调用一个方法来添加新片段......问题是……当我发送意图并从意图库中获取图片 abck 时……片段活动被破坏并重新创建……所以异步任务指的是活动的旧/错误实例……我怎么能解决这个问题?