2013-06-27 4 views
1

Я знаю, что здесь есть похожие вопросы, но мне нужно знать, что делать в моем случае использования.
я получил ошибкуОшибка Android Fragment при изменении ориентации

make sure class name exists, is public, and has an empty constructor that is public

Это потому, что мои inner Fragment Class потребности быть static и вернуть экземпляр. У меня есть обработка экрана в setScreens() method, которая ломается, когда я устанавливаю ее в static, что я должен делать, если я хочу называть ее из статического фрагмента.

Поскольку я использую GlobalState расширяющее приложение, для сохранения моего выбора, и он показывает ошибки при доступе к R.id.

мне это нужно, потому что мне нужно получить доступ к данным в различных классах!

Это выдержка из основного класса, мне позже нужно сделать это с помощью 4 фрагментов.

//imports ... 
public class MainScreen extends FragmentActivity{ 

    GlobalState globalState; 
    String statute,section; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     GlobalState globalState = (GlobalState)getApplication(); 

     try { 
      statute = globalState.getStatute(); 
      section = globalState.getSection(); 

     }catch (NullPointerException e){} 

     setScreens(); 
    } 

    public void setScreens(){ 
      GlobalState globalState = (GlobalState)getApplication(); 
      try { 
       statute = globalState.getStatute(); 
       section = globalState.getSection(); 
      }catch (NullPointerException e){e.printStackTrace();} 

      int i = getLowestSelection(); 

      FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 

      //setting up for Landscape 
      //if (findViewById(R.id.fragtwo) != null) ... 

      //setting up for portrait 

      if (findViewById(R.id.fragone) != null) { 

        if (i == 0){ 
         StatuteScreen statuteScreenFragment = new StatuteScreen(); //External Class, no problem 
         transaction.replace(R.id.fragone,statuteScreenFragment); 
        } 
        else if (i == 1){ 
         SectionsScreen sectionsScreenFragment = new SectionsScreen();//Inner Class throws the error 
         transaction.replace(R.id.fragone,sectionsScreenFragment); 
        } 
      }   
     transaction.addToBackStack(null); 
     transaction.commit(); 
    } 

    public class SectionsScreen extends Fragment{ 

     String title; 
     ArrayList<DetailData> dataList; 
     ListView listView; 

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

      View view = inflater.inflate(R.layout.sections,container,false); 

      listView = (ListView)view.findViewById(R.id.lvSections); 

      DataBaseHelper dataBaseHelper = new DataBaseHelper(getActivity()); 

      globalState = (GlobalState)getActivity(). getApplication(); 

      try { 
       title = globalState.getStatute(); 
      } catch (NullPointerException e){}; 

      if(title != null){ 
       dataList = dataBaseHelper.getDetailsNames(title); 

       dataBaseHelper.close(); 
       listView.setAdapter(new SectionsAdapter(getActivity(),dataList)); 
       listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
        @Override 
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 

         globalState.setSection(dataList.get(i).getAbsch()); 
         setScreens(); 
        } 
       }); 
      } 
      return view; 
     } 
    } 
} 

Как я могу заставить это работать, чтобы он не падал при изменении ориентации? Могу ли я получить Globalstate и R.id от статического метода?

ответ

0

Вы делаете все это неправильно.

Я настоятельно рекомендую вам потратить время, чтобы прочитать docs on Fragments, особенно раздел «Общение с деятельностью». То, как вы используете класс Application, не имеет смысла.

убедитесь именем класса существует, является общедоступным, и имеет пустой конструктор, который является общественным

Я не вижу пустой открытый конструктора ... и без объявления внутреннего класса как статические, он будет ссылаться на свою деятельность и вызывать утечки и другие проблемы.

Вы можете избежать всего этого путем рефакторинга SectionsScreen в собственный файл или с использованием соответствующих шаблонов обратного вызова.

+0

ok thx для обратной связи. Сначала у меня были фрагменты в их собственных файлах. Но мне все они нужны, чтобы вызвать метод setScreens, и мысль, использующая внутренние классы, - это путь. Не был уверен, могу ли я реализовать обратные вызовы из всех 4 фрагментов в Основной деятельности. – M4tchB0X3r

+0

Прочтите документацию (см. Выше), и вы найдете правильный способ сделать все это. –

+0

Будет делать. Я предполагаю, что я буду реализовывать интерфейсы обратного вызова всех фрагментов. Я думал, что это было чище, если бы все было в одном месте. Но имеет смысл, я думаю. – M4tchB0X3r