Понять код активности вкладки. Каковы отношения между PagerAdapter и Placeholder - PullRequest
0 голосов
/ 05 мая 2019

Я создал вкладку Activity из шаблона AS.Он автоматически создает следующие коды:

папка ui.main:

  • PageViewModule
  • PlaceholderFragment
  • SectionsPage
  • MainActivity

папка Java:

  • MainActivity.java

Layout.java

  • activity_mainxml
  • фрагмент_основ.xml

Я следую учебному видео, и оно сильно отличается от того, что я видел в AS.

Я понял, что Activity_main содержит панель действий, которая включает в себя макет вкладки и ViewPager, который может отображать фрагмент с помощью SectionsPagerAdapter.java.

Что я не понял, так это код между Placeholder, SectionsPagerAdapter и PageViewModel.Я добавил несколько комментариев в мой код, что является моей путаницей.

SectionPagerAdapter.java

public Fragment getItem(int position) {
        // Trying to use this to create the different Fragment but it doesn't work.
        switch(position){
            case 0:
                return new Fragment1();
            case 1:
                return new Fragment2();
            case 2:
                return new Fragment3();
        }
        return null;

        // return PlaceholderFragment.newInstance(position + 1);
    }

PlaceholderFragment.java

    private static final String ARG_SECTION_NUMBER = "section_number";
    private PageViewModel pageViewModel;

// Use PlaceholderFragment to display the Fragment selected by 
// SectionPageAdapter
    public static PlaceholderFragment newInstance(int index) {
        PlaceholderFragment fragment = new PlaceholderFragment();

        //why we need to create a BUNDLE here?
        Bundle bundle = new Bundle();
        bundle.putInt(ARG_SECTION_NUMBER, index);
        fragment.setArguments(bundle);
        return fragment;
    }

    @Override
    // What's the function of onCreate? 
    // Why we need PageViewModel?
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        pageViewModel = ViewModelProviders.of(this).get(PageViewModel.class);
        int index = 1;
        if (getArguments() != null) {
            index = getArguments().getInt(ARG_SECTION_NUMBER);
        }
        pageViewModel.setIndex(index);
    }

    @Override
    public View onCreateView(
            @NonNull LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        // To create the Fragment. In here it is only Fragment1 
        // That's the reason why it can only display the same Fragment?
        // How to make it associate with different Fragment?
        View root = inflater.inflate(R.layout.fragment1, container, false);

        // Change the textView in the `fragment_main.xml` based on the 
        // different tab you chose. 
        // Example: Tab 1 --> textView" You selected Tab1"
        final TextView textView = root.findViewById(R.id.section_label);
        pageViewModel.getText().observe(this, new Observer<String>() {
            @Override
            public void onChanged(@Nullable String s) {
                textView.setText(s);
            }
        });
        return root;
    }

PageViewModel.java

private MutableLiveData<Integer> mIndex = new MutableLiveData<>();
    private LiveData<String> mText = Transformations.map(mIndex, new Function<Integer, String>() {
        @Override
        public String apply(Integer input) {
            return "Hello world from section: " + input;
        }
    });

    public void setIndex(int index) {
        mIndex.setValue(index);
    }

    public LiveData<String> getText() {
        return mText;
    }

Может ли кто-нибудь помочь объяснить, как связать Fragment с SectionsPager и как использовать Placeholder для отображения фрагмента в ViewPager?Это почти на 80% отличается от видео, которое я смотрел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...