Использование фрагментов экрана на андроиде

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

Когда приложение запускается, оно загружает действие, которое должно содержать два фрагмента. Фрагмент 1 содержит список сохраненных логинов, а фрагмент 2 покажет детали, связанные с этим логином.

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

В моем основном классе деятельности у меня есть следующее.

public class PasswordListMain extends Activity {

    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.password_management);
    }

}

XML-файл password_management содержит следующее:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <fragment
        android:id="@+id/passwordList"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        class="com.BoardiesITSolutions.PasswordManager.PasswordListFrag">
    </fragment>
</LinearLayout>

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

PasswordListFrag содержит следующее

public class PasswordListFrag extends ListFragment{

    Common common; 
    com.BoardiesITSolutions.logic.ManagePasswordList managePasswordList;

    ArrayList<String> savedPassword;
    TextView txtNoRecords;
    ListView myListView;
    ArrayAdapter<Spanned> passwordArrayAdapter;
    AdView adView;

    @Override
    public View onCreateView(LayoutInflater inflator, ViewGroup container, Bundle savedInstanceState)
    {
        View view = inflator.inflate(R.layout.password_list, container, false);

        myListView = getListView();
        common = new Common(getActivity().getApplicationContext());

        //AdView adView = (AdView)findViewById(R.id.adView);
        common.requestAdvert(adView);

        managePasswordList = new ManagePasswordList(getActivity().getApplicationContext());
        //txtNoRecords = (TextView)findViewById(R.id.password_noRecords);
        populateListArray();

        common.showToastMessage("Adapter updated", Toast.LENGTH_LONG);

        //myListView.setOnItemClickListener(mListView);

        return view;
    }

    private void populateListArray()
    {

        ArrayList<Spanned> passwords = managePasswordList.getPasswordList();
        if (passwords != null && passwords.size() > 0)
        {
            passwordArrayAdapter = new ArrayAdapter<Spanned>(getActivity().getApplicationContext(), 
                    android.R.layout.simple_list_item_1, passwords);
            setListAdapter(passwordArrayAdapter);
            passwordArrayAdapter.setNotifyOnChange(true);
            myListView.setTextFilterEnabled(true);
            txtNoRecords.setVisibility(View.GONE);
        }
        else
        {
            txtNoRecords.setVisibility(View.VISIBLE);
        }
    }
}

Ниже приведен XML для фрагмента списка

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads"
    android:layout_width="match_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <TextView android:id="@+id/password_noRecords"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:layout_gravity="center"
        android:text="There are currently\nno saved logins"
        android:textSize="20dp"
        android:textStyle="bold|italic"/>
    <ListView 
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_above="@+id/adView">
    </ListView>
        <com.google.ads.AdView android:id="@+id/adView"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            ads:adUnitId="5555555"
            ads:adSize="BANNER"
            android:layout_alignParentBottom="true">
        </com.google.ads.AdView>
</RelativeLayout>

Когда приложение загружается, оно мгновенно вылетает при попытке загрузить этот экран.

Ошибка

java.lang.RuntimeException: Unable to start activity ComponentInfo PasswordListMain: android.view.InflatException: Binary XML file line #7 Error inflating class fragment

Я понятия не имею, что вызывает это или как решить проблему.

Спасибо за любую помощь, которую вы можете предоставить.


person Boardy    schedule 07.09.2012    source источник
comment
Я предполагаю, что путь к классу неверен в элементе фрагмента для вашего объявления xml.   -  person ahodder    schedule 07.09.2012
comment
Я дважды проверил, но, похоже, все в порядке.   -  person Boardy    schedule 07.09.2012
comment
ListFragments требуют, чтобы Listview имел идентификатор @android:id/list, так ли это?   -  person JRaymond    schedule 07.09.2012
comment
Да, я добавил файл XML, извините, что так и думал, но в нем есть @android:id/list.   -  person Boardy    schedule 07.09.2012


Ответы (1)


Мое лучшее предположение о проблеме - это строка (но, по общему признанию, я не уверен):

myListView = getListView();

Вы вызываете его до того, как у фрагмента появится представление, и я не думаю, что это сработает слишком хорошо. Я бы рекомендовал выполнять работу по инициализации представлений, задействованных в onActivityCreated(), а не в onCreateView() и других компонентах (таких как ваше хранилище данных и Common) в onCreate().

person JRaymond    schedule 07.09.2012
comment
Да, это хороший ответ, onCreateView() следует использовать только для создания представления, выполняйте свою работу в onActivityCreated() - person florianmski; 07.09.2012
comment
Спасибо, что вы написали, сделал это и, кажется, работает, теперь нужно заставить работать второй фрагмент :) - person Boardy; 07.09.2012