【问题标题】:Fragment is showing but not attached to activity片段正在显示但未附加到活动
【发布时间】:2016-10-28 07:15:33
【问题描述】:

您好,我正在一个应用程序中工作,其中:

  1. 查看寻呼机是否有活动。
  2. 在该视图寻呼机上,我显示了 2 个片段(frag1 和 frag2)。
  3. 在按钮上单击 frag1,我们又添加了一个片段(比如说 frag3)。
  4. 然后按 frag3 后我又按 frag1。

问题:

问题是当我在后按时从 frag3 回到 frag1 时,有时 frag1 未附加到活动。

我无法弄清楚这是怎么回事。

如果发生这种情况,那么解决方案是什么,以便我可以停止活动以分离 frag1 或再次重新初始化 frag1。

请帮忙。

【问题讨论】:

  • 当你想保存你的片段状态时,尝试将你的片段添加到 backstack 中
  • 在为 frag1 创建时使用 addToBackStack
  • 但是 frag1 在 vi​​ewpager 上,我也应该添加它吗? @Shane
  • 这可能是由于您在回堆碎片的方式,但这是在黑暗中拍摄的。如果您仍然遇到此问题,请继续提供您的代码库。

标签: android android-fragments fragment-backstack


【解决方案1】:

此代码可能对您有所帮助

public class PageAdapter extends FragmentPagerAdapter  implements IconPagerAdapter {
    protected static final int[] PAGER = new int[] {
            R.drawable.image1,
            R.drawable.image2,
            R.drawable.image3,
            R.drawable.image4
    };

    private int mCount = PAGER.length;

    public PagerFragmentAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        return new PagerFragment(PAGER[position]);
    }

    @Override
    public int getIconResId(int index) {
        return ICONS[index % PAGER.length];
    }

    @Override
    public int getCount() {
        return mCount;
    }

    public void setCount(int count) {
        if (count > 0 && count <= 10) {
            mCount = count;
            notifyDataSetChanged();
        }
    }
}

定义片段

public final class PagerFragment extends Fragment {
    private static final String KEY_CONTENT = "PagerFragment:Content";
    int imageSource;

    public PagerFragment(int imageSource) {
        this.imageSource = imageSource;

    }

    public PagerFragment() {

    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if ((savedInstanceState != null) && savedInstanceState.containsKey(KEY_CONTENT)) {
            imageSource = savedInstanceState.getInt(KEY_CONTENT);
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        ViewGroup root = (ViewGroup) inflater.inflate(R.layout.indicatorpage, null);
        ImageView image = (ImageView) root.findViewById(R.id.pagerImage);
        image.setImageResource(imageSource);
        setRetainInstance(true);
        return root;
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt(KEY_CONTENT, imageSource);
    }
}

MainActivity 类

public class MainActivity extends FragmentActivity {
    PagerFragmentAdapter mAdapter;
    ViewPager mPager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mAdapter = new PagerFragmentAdapter(getSupportFragmentManager());
        mPager = (ViewPager) findViewById(R.id.pager);
        mPager.setAdapter(mAdapter);
        mPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                System.out.println("selected page is :" + position);

            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

        CirclePageIndicator mIndicator = (CirclePageIndicator) findViewById(R.id.indicator);
        mIndicator.setViewPager(mPager);

        final float density = getResources().getDisplayMetrics().density;
        mIndicator.setRadius(7 * density);
        mIndicator.setPageColor(0x00000000);
        mIndicator.setFillColor(0xFFFFFFFF);
        mIndicator.setStrokeColor(0xFFFFFFFF);
        mIndicator.setStrokeWidth(1 * density);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

【讨论】:

    猜你喜欢
    • 2014-04-13
    • 1970-01-01
    • 2015-04-24
    • 2018-01-05
    • 2012-12-01
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多