C++ бросил стили синтаксиса

Использование ViewPager.OnPageChangeListener - правильный путь, но вам нужно будет немного реорганизовать ваш адаптер, чтобы сохранить ссылку на каждый фрагмент, содержащийся в FragmentPagerAdapter.

Вы используете это, используя [#]

 class PagerAdapter extends FragmentPagerAdapter {
        String tabTitles[] = new String[] { "One", "Two", "Three", "Four"};
        Context context;

        //This will contain your Fragment references:
        public Fragment[] fragments = new Fragment[tabTitles.length];

        public PagerAdapter(FragmentManager fm, Context context) {
            super(fm);
            this.context = context;
        }
        @Override
        public int getCount() {
            return tabTitles.length;
        }
        @Override
        public Fragment getItem(int position) {
            switch (position) {
            case 0:
                return new FragmentOne();
            case 1:
                return new FragmentTwo();
            case 2:
                return new FragmentThree();   
            case 3:
                return new FragmentFour();
            }
            return null;
        }

        //This populates your Fragment reference array:
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            Fragment createdFragment = (Fragment) super.instantiateItem(container, position);
            fragments[position]  = createdFragment;
            return createdFragment;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            // Generate title based on item position
            return tabTitles[position];
        }         
 }

Затем вместо создания нового фрагмента используйте тот, который содержится в адаптере:

mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
  @Override
  public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { }

  @Override
  public void onPageSelected(int position) {

        // do this instead, assuming your adapter reference
        // is named mAdapter:
        Fragment frag = mAdapter.fragments[position];
        if (frag != null && frag instanceof FragmentTwo) {
          ((FragmentTwo)frag).sendGetRequest();
        }
  }

  @Override
  public void onPageScrollStateChanged(int state) {  }
});

Обратите внимание: если вы используете разные классы фрагментов в своем адаптере, вы можете реализовать интерфейс, который определяет sendGetRequest(), а в каждом из ваших классов фрагментов реализует метод sendGetRequest ().

Если вы не идете с интерфейсом, вам нужно будет отбросить фрагмент к вашему собственному типу фрагмента, как показано в примере выше, то есть:

if (frag instanceof FragmentTwo) {
    ((FragmentTwo)frag).sendGetRequest();
}
30
задан Community 23 May 2017 в 11:47
поделиться

8 ответов

Это - лучшая практика никогда для использования бросков C-стиля по трем главным причинам:

  • , как уже упомянуто, никакая проверка не выполняется здесь. Программист просто не может знать, кто из различных бросков используется, который ослабляет строгий контроль типов
  • , новые броски намеренно визуально поразительны. Так как броски часто проявляют слабость в коде, утверждается, что создание бросков, видимых в коде, является хорошей вещью.
  • это особенно верно при поиске бросков с автоматизированным инструментом. Нахождение бросков C-стиля надежно почти невозможно.

, Поскольку palm3D отметил:

я нахожу синтаксис броска в стиле С++ слишком подробным.

Это является намеренным по причинам, приведенным выше.

синтаксис конструктора (официальное название: бросок функционального стиля), семантически тот же как бросок C-стиля и должен избежаться также (за исключением переменных инициализаций на объявлении), по тем же причинам. Это спорно, должно ли это быть верно даже для типов, которые определяют пользовательских конструкторов, но в Эффективном C++, Meyers утверждает, что даже в тех случаях необходимо воздержаться от использования их. Проиллюстрировать:

void f(auto_ptr<int> x);

f(static_cast<auto_ptr<int> >(new int(5))); // GOOD
f(auto_ptr<int>(new int(5));                // BAD

static_cast здесь будет на самом деле звонить auto_ptr конструктор.

49
ответ дан Andrew 27 November 2019 в 23:23
поделиться

Согласно Stroustrup:

"модернизированные броски" были представлены, чтобы дать программистам шанс указать их намерения более ясно и для компилятора для фиксации большего количества ошибок.

Поэтому действительно, для безопасности, поскольку это делает дополнительное время компиляции, проверяя.

12
ответ дан hometoast 27 November 2019 в 23:23
поделиться

Относительно этого предмета я следую рекомендациям, предоставленным Scott Meyers ( Более эффективный C++ , Объект 2: Предпочтите броски в стиле С++).

я соглашаюсь, что бросок стиля C++ является подробным, но это - то, что мне нравятся приблизительно они: их очень легко определить, и они делают код легче читать (который более важен, чем запись).

Они также вынуждают Вас думать о том, в каком брошенный Вы нуждаетесь, и к выбрал правильный, снизив риск ошибок. Они также помогут Вам обнаруживающий ошибки во время компиляции вместо этого во времени выполнения.

5
ответ дан Jérôme 27 November 2019 в 23:23
поделиться

Я использую static_cast по двум причинам.

  1. явно ясно, что происходит. Я не могу перечитать по этому, не понимая, что существует продолжение броска. С бросками C-стиля Вы следите, может передать прямо по нему без паузы.
  2. легко искать каждое место в моем коде, куда я бросаю.
2
ответ дан Bill the Lizard 27 November 2019 в 23:23
поделиться

Определенно в стиле С++. Дополнительный ввод поможет препятствовать тому, чтобы Вы бросили, когда Вы не были должны:-)

2
ответ дан Ben Collins 27 November 2019 в 23:23
поделиться

C-стиль бросил синтаксис, не делайте проверки на ошибки. Синтаксис броска в стиле С++, делает некоторую проверку. При использовании static_cast, даже если это не делает проверки, по крайней мере, Вы знаете, что необходимо быть осторожными здесь.

1
ответ дан CiNN 27 November 2019 в 23:23
поделиться

Бросок C-стиля является худшим способом пойти. Более трудно видеть, ungreppable, соединяет различные действия, которые не должны соединяться и не могут сделать всего, что могут сделать броски в стиле С++. Они действительно должны были удалить броски C-стиля из языка.

1
ответ дан DrPizza 27 November 2019 в 23:23
поделиться

Мы в настоящее время используем броски C-стиля везде. Я спросил другой вопрос о кастинге , и я теперь вижу преимущество использования static_cast вместо этого, если ни по какой другой причине, чем он "greppable" (мне нравится этот термин). Я, вероятно, начну использовать это.

мне не нравится стиль C++; это смотрит совсем как вызов функции.

1
ответ дан Community 27 November 2019 в 23:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: