【问题标题】:How to count fragments?如何计算碎片?
【发布时间】:2015-04-24 00:27:16
【问题描述】:

我有一个显示 3 个片段的活动和寻呼机适配器。碎片被打乱。当我浏览它们时,我需要知道每页的编号,并且该编号需要显示在 textView 中。比如我在第一页时显示1号,第二页-号2以此类推。

PagerAdapter.java

public class PagerAdapter extends FragmentPagerAdapter {

    private List<Fragment> fragments;

    public PagerAdapter(FragmentManager fm, List<Fragment> fragments) {
        super(fm);
        this.fragments = fragments;
    }

    @Override
    public Fragment getItem(int arg0) {
        return this.fragments.get(arg0);
    }

    @Override
    public int getCount() {
        return this.fragments.size();
    }

    public void setFragments(List<Fragment> fragments) {
        this.fragments = fragments;
    }
}

ma​​inActivity.java

    public class testActivity extends FragmentActivity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_pager_adapter);
            initialisePaging();
        }

        private  void initialisePaging() {
            List<Fragment> fragments = new Vector<Fragment>();
            fragments.add(Fragment.instantiate(this,fragment1.class.getName()));
            fragments.add(Fragment.instantiate(this,fragment2.class.getName()));
            fragments.add(Fragment.instantiate(this,fragment3.class.getName()));
            PagerAdapter mPagerAdapter = new PagerAdapter(this.getSupportFragmentManager(), fragments);
        Collections.shuffle(fragments, new Random(System.nanoTime()));

            ViewPager pager = (ViewPager) findViewById(R.id.viewpager);
            pager.setAdapter(mPagerAdapter);

        }


        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.menu_test, menu);
            return true;
        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            int id = item.getItemId();

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

            return super.onOptionsItemSelected(item);
        }

    }

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

    如果您想在片段中显示数字,请使用此

    在您的活动中

    @Override
    public Fragment getItem(int position) {
        // Here you can add an argument that will be passed to the fragment
        // In your case you need to pass the page number
        Fragment fragment = this.fragments.get(arg0);
        Bundle b = new Bundle();
        b.putInt("page_number", position);
        fragment.setArguments(b);
        return fragment;
    }
    

    在你的片段中这样做

    int number;
    
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Read the data that Activity passed to us
        if (savedInstanceState == null) {
            Bundle args = getArguments();
            if (args != null) {
                number = args.getInt("page_number") + 1;
            }
        }
        else {
            number = savedInstanceState.getInt("page_number");
        }
    }
    
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        // Here you need to find your TextView and show the number
        View v = inflater.inflate(R.layout.some_layout, container, false);
        ((TextView) v.findViewById(R.id.someTextView)).setText(String.format("%d", number));
        return v;
    }
    
    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt("page_number", number);
    }
    

    如果您想在 Activity 中显示数字,请使用此

    private  void initialisePaging() {
        List<Fragment> fragments = new Vector<Fragment>();
        fragments.add(Fragment.instantiate(this,fragment1.class.getName()));
        fragments.add(Fragment.instantiate(this,fragment2.class.getName()));
        fragments.add(Fragment.instantiate(this,fragment3.class.getName()));
        PagerAdapter mPagerAdapter = new PagerAdapter(this.getSupportFragmentManager(), fragments);
        Collections.shuffle(fragments, new Random(System.nanoTime()));
    
        // !!! Change ME!!!!!
        textView = (TextView) findViewById(R.id.someTextView);
    
        ViewPager pager = (ViewPager) findViewById(R.id.viewpager);
    
        pager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int i, float v, int i2) {
    
            }
    
            @Override
            public void onPageSelected(int i) {
                textView.setText("Position: " + i);
            }
    
            @Override
            public void onPageScrollStateChanged(int i) {
    
            }
        });
    
        pager.setAdapter(mPagerAdapter);
    
    
    }
    

    【讨论】:

    • onPageSelected 之后应该写什么?
    • 查看我的编辑,我已将您指向我的一个项目。我讨厌模仿自己;)
    • 我还不清楚。请注意,我不想对片段做任何事情。我只需要一个 textView 来显示页面的编号(不是片段,我不关心它们的顺序)。当我从左向右滑动时,该数字需要增加,而当我从右向左滑动时,该数字需要减少。
    • 我认为第一段代码应该写在PagerAdapter.java中。但是不知何故,它无法解析符号“位置”。我该怎么办?
    • 把 arg0 改成位置,我的错
    【解决方案2】:

    PageChangeListener 用作:

    yourPager.setOnPageChangeListener(new OnPageChangeListener() {
    
         @Override
         public void onPageSelected(int position)
         {
             yourTextView.setText("Page: " + position); 
         }
    
         ... ... 
    
      });
    

    【讨论】:

    • 是的,我想这是一个简单而完美的解决方案
    猜你喜欢
    • 2011-06-02
    • 2012-11-26
    • 2012-10-08
    • 1970-01-01
    • 2018-05-24
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    相关资源
    最近更新 更多