简体   繁体   English

我无法通过 ViewPager 将项目编号正确传递给片段

[英]I can’t correctly pass the item number to the fragment via ViewPager

ViewPager code: ViewPager 代码:

public class CrimePagerActivity extends AppCompatActivity {

    private static final String EXTRA_CRIME_ID =
            "com.bignerdranch.android.criminalintent.crime_id";

    private static ViewPager mViewPager;
    public static List<Crime> mCrimes;
    public static int indexPager;

    private Button startButton;
    private Button finishButton;

    public static Intent newIntent(Context packageContext, UUID crimeId) {
        Intent intent = new Intent(packageContext, CrimePagerActivity.class);
        intent.putExtra(EXTRA_CRIME_ID, crimeId);
        return intent;
    }

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

        UUID crimeId = (UUID) getIntent()
                .getSerializableExtra(EXTRA_CRIME_ID);

        mViewPager = (ViewPager) findViewById(R.id.crime_view_pager);
        mViewPager.setClipToPadding(false);
        mViewPager.setPadding(20, 0, 20, 0);
        mViewPager.setPageMargin(20);
        mCrimes = CrimeLab.get(this).getCrimes();
        FragmentManager fragmentManager = getSupportFragmentManager();
        mViewPager.setAdapter(new FragmentStatePagerAdapter(fragmentManager) {

            @Override
            public Fragment getItem(int position) {  // !!!
                Crime crime = mCrimes.get(position);
                indexPager = position;
                return CrimeFragment.newInstance(crime.getId());
            }

            @Override
            public int getCount() {
                return mCrimes.size(); //!!!!!!!!
            }
        });

        for (int i = 0; i < mCrimes.size(); i++) {
            if (mCrimes.get(i).getId().equals(crimeId)) {
                mViewPager.setCurrentItem(i);
                indexPager = i;
                break;
            }
        }
    }

    public static void razmeshcheniyePager(int a){
        mViewPager.setCurrentItem(a);
    }
}

And fragment code:和片段代码:

 public class CrimeFragment extends Fragment {

    private static final String ARG_CRIME_ID = "crime_id";

    private Crime mCrime;
    private EditText mTitleField;
    private Button mDateButton;
    private CheckBox mSolvedCheckBox;

    private Button startButton;
    private Button finishButton;

    private CrimePagerActivity mPagerActivity;

    public static CrimeFragment newInstance(UUID crimeId) {
        Bundle args = new Bundle();
        args.putSerializable(ARG_CRIME_ID, crimeId);
        CrimeFragment fragment = new CrimeFragment();
        fragment.setArguments(args);
        return fragment;
    }

        @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
            UUID crimeId = (UUID) getArguments().getSerializable(ARG_CRIME_ID);
            mCrime = CrimeLab.get(getActivity()).getCrime(crimeId);
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_crime, container, false); // уточнить, что происходит здесь
        mTitleField = (EditText) v.findViewById(R.id.crime_title);


        startButton = (Button) v.findViewById(R.id.start_button); 
        if(CrimePagerActivity.indexPager == 2) startButton.setEnabled(false);
        startButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mPagerActivity.razmeshcheniyePager(0);
            }
        });

        finishButton = (Button) v.findViewById(R.id.fifsh_button); 
        if (CrimePagerActivity.indexPager == CrimePagerActivity.mCrimes.size()-3) finishButton.setEnabled(false);
        finishButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mPagerActivity.razmeshcheniyePager(CrimePagerActivity.mCrimes.size()-1);
            }
        });

        mTitleField.setText(mCrime.getTitle());
        mTitleField.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                mCrime.setTitle(s.toString()); // возвращает строку, которая используется для задания заголовка Crime
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });

        mDateButton = (Button) v.findViewById(R.id.crime_date); // кнопка во фрагменте создаётся немного не так, как в активности
        mDateButton.setText(mCrime.getDate().toString()); // вывод даты на кнопке
        mDateButton.setEnabled(false); // блокироание возможности нажатия кнопки

        mSolvedCheckBox = (CheckBox)v.findViewById(R.id.crime_solved);
        mSolvedCheckBox.setChecked(mCrime.isSolved()); // метод setChecked меняет булеву значение булевой переменной на противоположное
        mSolvedCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                mCrime.setSolved(isChecked);
            }
        });
        return v;
    }
}

I need to block the button to move to the beginning or end of the list, in case the user is already at the beginning or end of the list.我需要阻止按钮移动到列表的开头或结尾,以防用户已经在列表的开头或结尾。 To do this, I am trying to pass the position of an element through a static variable.为此,我试图通过静态变量传递元素的位置。 The problem is that the position of the element is not transmitted correctly (that is, when the number 0 should be transmitted, 2 is transmitted, when 99 should be transmitted, 97 is transmitted).问题是元素的位置没有正确传输(即应该传输数字0时传输2,应该传输99时传输97)。 And even if you take this into account in the code of the fragment, the button lock still does not work correctly (buttons may even be blocked on several elements located nearby).即使你在片段的代码中考虑到这一点,按钮锁仍然无法正常工作(按钮甚至可能被位于附近的几个元素阻止)。 I tried to find the problem using debug, ran into yet another obscure feature.我试图使用调试找到问题,但遇到了另一个晦涩的功能。 The code, before locking the buttons, can be called several times in turn (it may not be called at all).代码在锁定按钮之前,可以依次调用多次(可能根本不会调用)。 The code of some methods in the anonymous class new FragmentStatePagerAdapter (which is in the CrimePagerActivity activity) can be called a huge number of times.匿名类 new FragmentStatePagerAdapter(CrimePagerActivity 活动中)中的一些方法的代码可以被调用大量的次数。 Please explain what is happening and what to do about it.请解释发生了什么以及如何处理。

PS Sample code taken from a book "Android Programming: The Big Nerd Ranch Guide" (3rd Edition) (Big Nerd Ranch Guides). PS 示例代码取自《Android 编程:大书呆子牧场指南》(第 3 版)(大书呆子牧场指南)一书。 Bill Phillips, Chris Stewart, Kristin Marsicano.比尔·菲利普斯、克里斯·斯图尔特、克里斯汀·马西卡诺。 chapter 11第11章

You are setting indexPager in getItem() .您正在getItem()中设置indexPager This isn't correct.这不正确。 getItem() can be called at any time for any reason and doesn't necessarily reflect the currently viewed or selected item. getItem()可以因任何原因随时调用,不一定反映当前查看或选择的项目。 You need to find another way to set the current "selected" item.您需要找到另一种方法来设置当前的“选定”项。

See the documentation for FragmentStatePagerAdapter .请参阅FragmentStatePagerAdapter文档 There is a good example of how to do this in that documentation.在该文档中有一个很好的示例说明如何执行此操作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM