2013-09-19 2 views
0

Так что я пытаюсь получить некоторый опыт работы с фрагментами, но я нахожу некоторые контрольно-пропускные пункты.Фрагменты, параметры и ActionBar 'Up' Navigation

Моя текущая ситуация следующая.

У меня есть активность, которая отображает список, содержимое которого определяется параметрами Extra Intent, отправленными из операции «вызов».

Этого список активность использует ListFragment объявленной в XML следующим образом:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" android:background="@color/black"> 
    <fragment class="com.pixlworks.NLC.DirectoryBrowse$ListingFragment" 
       android:id="@+id/listing" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" /> 

</FrameLayout> 

В настоящее время я получаю параметр, который указует тип контента непосредственно в фрагменте путем доступа к Дополнительным данным Намерения активности (или сохраненному Bundle, если таковой имеется):

public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 

    if (savedInstanceState != null) 
     mListingType = savedInstanceState.getString(Utils.DIRECTORY_TYPE_STORE_KEY); 
    else 
     mListingType = getActivity().getIntent().getStringExtra(Utils.DIRECTORY_TYPE_STORE_KEY); 

    // get content by type, create and set the adapter 

} 

Теперь часть моей проблемы заключается в том, что я не уверен, что это правильный путь «проход» этот параметр от деятельности к фрагменту.

Кроме того, у меня возникают проблемы с этой настройкой при использовании навигации навигации Action Bar. Когда я нажимаю на элемент в этом элементе списка, он переходит к другому действию, показывающему детали выбранного элемента. С этой детальной деятельностью:

  • Если я использую кнопку «Назад», активность списка возвращается из стека, как обычно, и все работает нормально.

  • Если я использую UP (несмотря на следующие шаги here), создается новый экземпляр вместо того, чтобы использовать тот, что находится в стеке, и этот новый экземпляр явно не получает параметр Extra в Intent. Поскольку я ожидаю, что значение будет существовать в сохраненном Bundle или в Intent, мое приложение выйдет из строя в этой ситуации.

Так до кипения вещи вниз, я не уверен, какой из них следовать, и как заставить их правильно работать с «UP» навигация:

A) Удержание параметра «Тип» в поле в Activity и сохраните его в пакете Activity onSaveInstanceState. В этом случае я не уверен, как передать значение Фрагменту. В этом случае мне просто нужно убедиться, что UP вызывает существующий экземпляр списка операций

B) Продолжите мою текущую настройку сохранения значения во Фрагменте вместо Activity, но опять же, как обрабатывать Правильная настройка навигации?

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

Спасибо за любую помощь заранее!

ответ

0

Навигация UP имеет смысл использовать в пределах одного уровня активности. Это намерение кодов, которые вы использовали на странице разработчиков. Поскольку вы начали новую деятельность, если вы хотите вернуться к предыдущему действию, например, к кнопке «Назад», вам нужно позвонить finish(), чтобы сначала уничтожить активность данных.

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

// in fragment class 
public static MyFragment newInstance(Bundle arg) { 
    MyFragment f = new MyFragment(); 
    f.setArguments(arg); 
    return f; 
} 

При создании нового фрагмента, вам можно назвать:

// in activity 
Bundle arg = new Bundle(); 
int info = ...; 
arg.putInt("INFO",info); 
... 
MyFragment mFragment = MyFragment.newInstance(arg); 

Наконец, чтобы получить данные в фрагменте:

int info = getArguments().getInt("INFO"); 
... 

ИНСТЕ объявление прямого вызова MyFragment mFragment = new MyFragment() для создания экземпляра фрагмента, вы должны использовать статический метод для его создания. Это делается для предотвращения некоторых сбоев, которые могут произойти, если вы поворачиваете экран, и структура жалуется, что не может найти публичный пустой конструктор.


UPDATE

Чтобы ответить на ваши вопросы:

1) Допустим, вы начинаете с деятельности А -> активность B. Тогда в деятельности B при нажатии кнопки вверх. По логике использования кнопка «вверх» не вернет вас к активности A, потому что ее целью является перемещение на один уровень вверх, но все еще внутри, активность B. Чтобы вернуться к активности A, вам нужно позвонить finish(), чтобы сначала уничтожить активность B ,

2) Если ваш фрагмент создан в xml, вы все равно можете установить аргументы. В вашем XML, установить идентификатор для фрагмента android:id="@+id/fragment_id", затем

// in activity 
FragmentManager fm = getSupportFragmentManager(); // or getFragmentManager() if you don't have backward compatibility 
MyFragment mFragment = fm.findFragmentById(R.id.fragment_id); 
Bundle arg = new Bundle(); 
// put data blah blah 
mFragment.setArguments(arg); 

Просто убедитесь, что вы установили аргументы, прежде чем использовать фрагмент.

Проще говоря, intent используется, когда вы передаете данные между вызывающими действиями; bundle используется, когда вы хотите передавать данные из активности в фрагмент.

+0

Благодарим за отзыв. Это вроде как предоставило мне больше вопросов, чем ответов, которые я думаю. 1) Что вы подразумеваете под навигацией UP, поскольку я смотрю на нее больше для «на одном уровне активности»? 2) В ссылке, которую я положил, в разделе «Навигация по родительской активности» говорится, что с использованием этого бита кода в навигации по UP появится какой-либо экземпляр уже запущенного Activity. Но это не похоже на произойдет 3) Код фрагмента, который вы предоставляете, работает, если я создавал экземпляр и добавлял фрагмент программно, но я его объявлял в XML. – RobertoCuba

+0

Создает и добавляет фрагмент программным способом единственный способ сделать это? – RobertoCuba

+0

Еще раз спасибо за Ответ: 1) По-моему, я до сих пор не понимаю, как один из них идет «вверх» в рамках одной и той же деятельности. Я думал, что вся эта работа навигации по навигации должна состоять в том, чтобы перемещаться по логическим деревьям «Родитель-ребенок» (следовательно, вся деятельность «Родитель» настройка в манифесте). В конце концов, то, что вы говорите о вызове finish(), - это именно то, что должен сказать код, о котором я говорил за кулисами, но он этого не делает. Он по-прежнему создает новый экземпляр. – RobertoCuba

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