Android FragmentActivity创建多个碎片并导致问题
我实例化了一个FragmentActivity(FA1),它在片段(F1)中显示文章(使用ViewPager)。每个文章片段都有一个额外类(W)的实例,即WebManager,它保存文章的ID。如果我单击文章中的一个图像,WebViewClient将创建另一个FragmentActivity(FA2)(文章ID保存在捆绑包中),它在片段中显示图像(F2) 发生了以下情况: FA1建造三个F1:A3、A2、A1(按此顺序)。每个F1都用它的ID(A3:ID=A3,A2:ID=A2,A1:ID=A1)实例化一个W。此外,ID会被覆盖,每次它的值都是A3。如果我点击A2中的图像,W将创建ID=A3的FA2,而不是A2 我可以做些什么来保存W的实例,我点击了F1? 不知道该怎么办:( 希望我能正确地(用英语)说明这个场景,用一种非常简单的方式问这个问题 --编辑-- F1: WebManager文章:Android FragmentActivity创建多个碎片并导致问题,android,android-fragments,android-fragmentactivity,Android,Android Fragments,Android Fragmentactivity,我实例化了一个FragmentActivity(FA1),它在片段(F1)中显示文章(使用ViewPager)。每个文章片段都有一个额外类(W)的实例,即WebManager,它保存文章的ID。如果我单击文章中的一个图像,WebViewClient将创建另一个FragmentActivity(FA2)(文章ID保存在捆绑包中),它在片段中显示图像(F2) 发生了以下情况: FA1建造三个F1:A3、A2、A1(按此顺序)。每个F1都用它的ID(A3:ID=A3,A2:ID=A2,A1:ID=A1
public class WebManagerArticle extends WebManager
{
private static WebManagerArticle instance = null;
private static int id = -1;
private static ArticleWebViewClient webViewClient = null;
private WebManagerArticle()
{
super();
webViewClient = new ArticleWebViewClient();
}
public static WebManagerArticle getInstance(Activity a, int articleId)
{
if (instance == null)
{
instance = new WebManagerArticle();
}
activity = a;
id = articleId;
return instance;
}
public ArticleWebViewClient getArticleWebViewClient(){return webViewClient;}
private class ArticleWebViewClient extends WebViewClient
{
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
{
...//HERE
Intent intent = new Intent(activity, ImagePageSliderActivity.class);
intent.putExtra("imagePath", imagePath); //get imagePath from url with pattern matching
intent.putExtra("articleID", id);
activity.startActivity(intent);
...
return true;
}
@Override
public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm)
{
handler.proceed(Constants.HTTP_USER, Constants.HTTP_PASSWORD);
}
}
}
ImagePageSlideActivity
public class ImagePageSliderActivity extends SherlockFragmentActivity
{
public Context context;
public int articleID;
public int pages;
private int startPosition;
public ArrayList<String> imagePaths;
private ViewPager viewPager;
@Override
protected void onCreate(Bundle savedInstanceState)
{
context = this;
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_article_page_slider);
String startImagePath = getIntent().getStringExtra("imagePath");
// here's the wrong article ID!!!
articleID = getIntent().getIntExtra("articleID", -1);
// pages get From Database
// startPosition get From Database
// imagePaths get from database
viewPager = (ViewPager) findViewById(R.id.articlePager);
PagerAdapter pagerAdapter = new ScreenSlidePagerAdapter(
getSupportFragmentManager());
viewPager.setAdapter(pagerAdapter);
viewPager.setCurrentItem(startPosition);
}
@Override
public void onBackPressed()
{
if (viewPager.getCurrentItem() == startPosition)
{
super.onBackPressed();
} else if (viewPager.getCurrentItem() > startPosition)
{
viewPager.setCurrentItem(viewPager.getCurrentItem() - 1);
} else if (viewPager.getCurrentItem() < startPosition)
{
viewPager.setCurrentItem(viewPager.getCurrentItem() + 1);
}
}
private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter
{
public ScreenSlidePagerAdapter(FragmentManager fm){super(fm);}
@Override
public Fragment getItem(int position)
{
Fragment fragment = new ImagePageFragment();
Bundle args = new Bundle();
args.putString("imagePath", imagePaths.get(position));
fragment.setArguments(args);
return fragment;
}
@Override
public int getCount()
{
return pages;
}
}
}
公共类ImagePageSliderActivity扩展SherlockFragmentActivity
{
公共语境;
公共文件ID;
公共int页面;
私人int起始位置;
公共阵列列表图像路径;
私人视页机视页机;
@凌驾
创建时受保护的void(Bundle savedInstanceState)
{
上下文=这个;
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u article\u page\u滑块);
字符串startImagePath=getIntent().getStringExtra(“imagePath”);
//这是错误的文章ID!!!
articleID=getIntent().getIntExtra(“articleID”,-1);
//从数据库获取的页面
//从数据库获取startPosition
//从数据库获取图像路径
viewPager=(viewPager)findViewById(R.id.articlePager);
PagerAdapter PagerAdapter=新屏幕幻灯片页面适配器(
getSupportFragmentManager());
viewPager.setAdapter(pagerAdapter);
viewPager.setCurrentItem(开始位置);
}
@凌驾
public void onBackPressed()
{
if(viewPager.getCurrentItem()==startPosition)
{
super.onBackPressed();
}else if(viewPager.getCurrentItem()>startPosition)
{
viewPager.setCurrentItem(viewPager.getCurrentItem()-1);
}else if(viewPager.getCurrentItem()
不要将WebManagerArticle
设置为单例,也不要将其字段设置为静态,因为它们将共享最后一个片段的初始化状态。当浏览页面器创建第一个页面片段时,WebManagerArticle
将与正确的id一起创建第二个页面片段已经构建了WebManagerArticle
,在其上设置字段将覆盖为第一个片段存储的先前数据。最后一个片段也会发生同样的情况,这就是为什么第三个片段的id是唯一的。不要将WebManagerArticle
设置为单例另外,不要只将其字段设置为静态,因为它们将共享最后一个片段的初始化状态。当ViewPager
创建第一个页面片段时,WebManagerTitle
将与正确的id一起创建。当构建第二个页面片段时,WebManagerTitle
已经生成,在其上设置字段将覆盖为第一个片段存储的以前的数据。对于最后一个片段也会发生同样的情况,这就是为什么您只获得第三个片段的id。您应该共享这些F1片段使用的代码,以及启动新片段的图像的onClick/onTouch处理程序活动性。我不明白的是,在传递给ImagePageFragment
的包中(在适配器中)你没有把articleID
键放在onCreateView中,但是你正在从参数中检索该键。这是怎么回事?另外,我希望你没有把articleID
变量设为静态变量。我在onCreateView
中有articleID(ArticlePageSliderActivity
,FA1)并将其放入扩展的FragmentStatePagerAdapter
getItem
方法中,然后将其放入ArticlePageFragment
(FA2)的捆绑包中,该捆绑包实例化了ArticleWebManager
(W)使用这个ID。在W中,它是一个静态属性,正如您所看到的,因为我将其实现为单例,以避免多次请求和实例化WebViewClient。但是如果我更改此ID,并将W实现为普通类(没有单例,也没有出现静态
)它是有效的!你认为它可以保存足够多,它不是单例吗?也许它必须不是单例?谢谢你的帮助!如果你发布它,我会接受它作为答案;)你应该分享那些F1片段使用的代码,以及你开始新活动的图像的onClick/onTouch处理程序。我不明白的是,在传递给ImagePageFragment
(适配器中)的捆绑包中,您没有放置articleID
键,但在onCreateView中,您正在从argu检索该键
public class ImagePageSliderActivity extends SherlockFragmentActivity
{
public Context context;
public int articleID;
public int pages;
private int startPosition;
public ArrayList<String> imagePaths;
private ViewPager viewPager;
@Override
protected void onCreate(Bundle savedInstanceState)
{
context = this;
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_article_page_slider);
String startImagePath = getIntent().getStringExtra("imagePath");
// here's the wrong article ID!!!
articleID = getIntent().getIntExtra("articleID", -1);
// pages get From Database
// startPosition get From Database
// imagePaths get from database
viewPager = (ViewPager) findViewById(R.id.articlePager);
PagerAdapter pagerAdapter = new ScreenSlidePagerAdapter(
getSupportFragmentManager());
viewPager.setAdapter(pagerAdapter);
viewPager.setCurrentItem(startPosition);
}
@Override
public void onBackPressed()
{
if (viewPager.getCurrentItem() == startPosition)
{
super.onBackPressed();
} else if (viewPager.getCurrentItem() > startPosition)
{
viewPager.setCurrentItem(viewPager.getCurrentItem() - 1);
} else if (viewPager.getCurrentItem() < startPosition)
{
viewPager.setCurrentItem(viewPager.getCurrentItem() + 1);
}
}
private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter
{
public ScreenSlidePagerAdapter(FragmentManager fm){super(fm);}
@Override
public Fragment getItem(int position)
{
Fragment fragment = new ImagePageFragment();
Bundle args = new Bundle();
args.putString("imagePath", imagePaths.get(position));
fragment.setArguments(args);
return fragment;
}
@Override
public int getCount()
{
return pages;
}
}
}