2015-02-24 4 views
0

У меня проблема с кросс-API. Мой сценарий выглядит следующим образом:Проблема с конверсией с вложенными фрагментами: android.support.v4.app.Fragment VS android.app.Fragment

  1. Я разрабатываю приложение, которое использует поддержка-v4-AppCompat, используя android.support.v4.app.Fragment;
  2. Я использую getChildFragmentManager для извлечения вложенных Фрагменты. Это необходимо, потому что у меня есть 0View, чтобы прокрутить несколько фрагментов :, один из которых использует com.google.android.gms.maps.SupportMapFragment как вложенный фрагмент;
  3. У меня также есть необходимость использовать ShinobiCharts, поскольку наше решение разрабатывается вместе с ним. ChartFragment является подклассом android.app.Fragment.

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

<fragment 
    class="com.shinobicontrols.charts.ChartFragment" 
    android:id="@+id/chart" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

и получить ссылку на него из другого фрагмента, как это:

public class TCPSpeedFragment extends android.support.v4.app.Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     FragmentManager fragMan = getChildFragmentManager(); 
     // BELLOW LINE GIVES ERROR OF TYPE CONVERSION 
     android.app.Fragment frag = fragMan.findFragmentById(R.id.chart); 

} 

Как мы можем видеть, данная ошибка - Тип несоответствия: невозможно преобразовать из android.support.v4.app.Fragment в android.app.Fragment. Но, пытаясь их преобразовать, это становится настоящей болью, и я еще не нашел решения.

У кого-нибудь есть идея решить эту проблему совместимости/конверсии?

+1

В их документации указано, что у них есть SupportChartFragment. – Luksprog

+0

Я собираюсь проверить его прямо сейчас! :) – mthama

ответ

1

Во-первых, я не верю, что вы можете получить ссылку на вложенный Fragment, который определен в XML. Это само по себе неправильно: вложенный Fragment s может быть добавлен только &, и я удивлен, что вы не подумали об этом как о потенциальной проблеме. Как вы определили, что Fragment в XML, а затем попытался получить ссылку на него, вызвав findViewById(), неверно.

Сейчас подходит к вашему основному вопросу, есть, к сожалению, NO способа бросить android.support.v4.app.Fragment к android.app.Fragment. У вас есть следующие варианты:

  • см, если библиотека имеет Fragment, который может быть использован с поддержкой v4 библиотеки
  • если библиотека с открытым исходным кодом, попробуйте изменить его так, что он использует android.support.v4.app.Fragment вместо android.app.Fragment
  • Если он не является открытым исходным кодом, вы можете прекратить использование библиотеки и попытаться найти другую, что делает, или вы можете отказаться от поддержки android.support.v4.app.Fragment в своем проекте и вместо этого использовать android.app.Fragment везде в своем приложении.

Надеюсь, это полезно.

+0

Привет, ZygoteInit, спасибо за ваш ответ. У меня есть рабочий код, который содержит два фрагмента в XML, раздутом в родительском фрагменте. Компонент com.google.android.gms.maps.SupportMapFragment вложен в файл android.support.v4.app.Fragment, обращаясь к нему с помощью ((SupportMapFragment) getChildFragmentManager(). FindFragmentById (R.id.frag_qualitymap_map)). GetMap(); , Я прыгаю, что могу использовать какой-то похожий код вроде этого ... – mthama

+0

Это новость для меня. Я всегда читал, что вложенные фрагменты могут использоваться только программно ... но если вы действительно смогли это сделать, вам больше силы :) –

+0

Больше энергии для всех нас;) – mthama

0

Хорошо ..Я думаю, что нашел решение для меня в том виде, в котором я искал. Я использую следующие строки:

Fragment frag = getChildFragmentManager().findFragmentById(R.id.chart); 
SupportChartFragment supportFrag = (SupportChartFragment)frag; 
ShinobiChart shinobiChart = supportFrag.getShinobiChart(); 

С этим я могу теперь скомпилировать свой проект без ошибок.

+0

Что касается вашего ChartFragmet, проверьте это: http: //www.shinobicontrols.com/forum/shinobicontrols/2014/5/shniobichart-in-fragmentstatepageradapter -> "в настоящее время наш ChartFragment не поддерживает вложенность внутри другого фрагмента.". Я также использую ShinobiCharts, но, как я вижу, ваш ответ не должен работать надежно, поскольку в документации Shinobi рекомендуется использовать ChartView. – Steffen

Смежные вопросы