次の問題があります..私のアプリには、ユーザーのすべての ProfilePictures + 新しい写真を追加するための追加のフラグメントを表示するアクティビティがあります。
Whats working: Fragment と StatePagerAdapter を使用した Fragment アクティビティがあります。
フラグメント: public class ScreenSlidePageFragment extends Fragment{
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 が最初のフラグメントに表示され、別の追加の UserProfilePic が残りのフラグメントに表示される必要があります。写真を含む配列が空の場合は、最後のフラグメントは、新しい画像を追加するオプションで追加する必要があります...しかし、それは今のところ重要ではありません...だから、今、私はメインのUserPictureを持つフラグメントと、新しい画像を追加する可能性のあるフラグメントを持っています... 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 は asyncTask であり、ギャラリーから選択された画像が呼び出されます。そこで onPostExecute メソッドで、彼は「savePic」を呼び出します...そしてこの最後のメソッドで、2 番目の既存のものに新しいフラグメントを追加したいと考えています。選択した画像を表示する最後の場所。しかし、新しいフラグメントを追加する方法がまったくわかりません..FragmentTransactionを使用しようとしましたが、うまくいきません..アダプターを使用しているためだと思います..誰か助けてもらえますか? 少なくとも、私が考えるべき方向へのヒントか何か... =(
------私なりの回答------
私はすでにFragmentTransactionを介してビューページャーを更新しようとしました..しかし、それは機能しません...私はアダプターを介してそれを行う必要があると思います...そして私はすでにこの方法でそれをやろうとしました...そしてそれも機能します..しかし悲しいことに、まったくありません..ギャラリーインテントで選択された画像を取得したい場合、画像は非同期タスクによってデコードされ、これはフラグメントアクティビティからメソッドを呼び出して新しいフラグメントを追加します...問題これは...インテントを送信してインテント ギャラリーから写真を取得すると...フラグメント アクティビティが破棄されて再作成されるため、asynctask はアクティビティの古い/間違ったインスタンスを参照します...どうすればよいですかこの問題を解決します?