2016-05-09 2 views
2

Я реализовал сканер NFC и когда тег сканируется метод onNewIntent вызывается успешно, например, так:Как получить текущий фрагмент в задаче выбора?

@Override 
protected void onNewIntent(Intent intent) { 
    setIntent(intent); 
    resolveIntent(intent); 
} 

В resolveIntent я хочу обновить пользовательский интерфейс, основанный на проверяемом теге. Проблема в том, что я не могу понять, как получить ссылку на фрагмент.

Я думал, что я мог бы использовать метод isValidFragment ухватить фрагмента, но не повезло до сих пор:

protected boolean isValidFragment(String fragmentName) { 

    if (fragmentName != null && !fragmentName.equals("")) { 
     Fragment f = getFragmentManager().findFragmentById(R.id.myFragment); // this is always null 
     if (f != null && f instanceof MyFragment) 
      myFragment = (MyFragment) f; 
    } 

    return PreferenceFragment.class.getName().equals(fragmentName) 
      || GeneralPreferenceFragment.class.getName().equals(fragmentName) 
      || MyFragment.class.getName().equals(fragmentName); 
} 

Так, в принципе единственное, что мне нужно, это ссылка на текущий фрагмент , то мне нужно проверить, является ли оно MyFragment, а затем просто вызвать метод, который обновляет пользовательский интерфейс.

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

EDIT: Это pref_headers.xml файл:

<preference-headers xmlns:android="http://schemas.android.com/apk/res/android"> 
    <header 
     android:fragment=".SettingsActivity$GeneralPreferenceFragment" 
     android:title="@string/pref_header_general" /> 
    <header 
     android:fragment=".SettingsActivity$MyFragment" 
     android:id="@+id/myFragment" 
     android:title="Test" /> 
</preference-headers> 
+0

"getFragmentManager(). FindFragmentById (R.id.myFragment)", чтобы использовать этот фрагмент кода, вам нужно дать идентификатор фрагмента элемента в XML-файле. Так вы можете получить ссылку от данного элемента в xml. Если вы можете разместить дополнительную информацию о своей архитектуре, мы можем найти способ ее достижения. –

+0

Похоже, что действие сканера начинает детальную активность при успешной проверке. Детальная деятельность раздувает один из трех разных фрагментов, чтобы показать детали различных типов объектов в пользовательском интерфейсе. Правильно? –

+0

@ EmreAktürk Я обновил свое сообщение с помощью фрагмента файла 'pref_headers.xml'. Я поместил там идентификатор фрагмента, но он, похоже, не распознается. – Apostrofix

ответ

-1

При инициализации фрагмента вы можете установить метки для фрагмента, как этот

mFT = mFragmentManager.beginTransaction(); 
mFT.replace(R.id.container, fragment, "myFragment"); 
mFT.commit(); 

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

if (fragmentName != null && !fragmentName.equals("")) { 
    Fragment f = getFragmentManager().findFragmentByTag("myFragment"); 
    if (f != null && f instanceof MyFragment) 
     myFragment = (MyFragment) f; 
} 

Надеюсь, это поможет

+0

Спасибо, но, к сожалению, я действительно не инициализирую его, вместо этого я использовал файл pref_headers.xml, как в примере Google. – Apostrofix

+0

, тогда вторым вариантом может быть проверка вашего импорта 'android.support.v4.app.Fragment;' заменить его на 'android.app.Fragment' – Max

+0

Это уже' android.app.Fragment' – Apostrofix

0

Класс заголовка не распространяется Фрагмент. Так вот почему вы всегда получаете нулевой объект. Вы пытаетесь передать объект другому, который не может полиморфно или пытаться найти способ фрагмента.

Откройте DDMS и попробуйте сбросить View Hiearchy, чтобы понять, как работает PreferenceActivity. Похоже, что он анализирует данный xml и раздувает другие компоненты представления, создавая пользовательский интерфейс.

Возможно, вы можете попробовать попробовать findViewById или загрузить различные XML-файлы предпочтений для изменения пользовательского интерфейса.

+0

Даже hardt, я не думаю, что заголовок имеет «классный» тег, чтобы его по-настоящему. Он может не загружать ваш фрагмент:/Но я не уверен в этом. –

2

PreferenceActivity, переопределить способ onAttachFragment. Там вы можете получить ссылку на фрагмент при нажатии.

@Override 
    public void onAttachFragment(Fragment fragment) { 
     super.onAttachFragment(fragment); 
    }