Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/222.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android FragmentActivity创建多个碎片并导致问题_Android_Android Fragments_Android Fragmentactivity - Fatal编程技术网

Android FragmentActivity创建多个碎片并导致问题

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

我实例化了一个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文章:

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;
        }
    }
}