Android: не удалось установитьContentView при переключении на ListActivity - PullRequest
3 голосов
/ 31 марта 2010

[обновить] Я получил сообщение об ошибке: «В вашем контенте должен быть ListView с атрибутом id« android.R.id.list »». Видимо, ничего в моем XML не является ListView. Но требуется ли это?

Это продолжение вопроса на мой предыдущий вопрос. Android: какой вид я должен использовать для отображения текста и изображения?

Я прочитал статью о создании ListView для LinearLayout. Однако мой следующий код не удался в функции setContentView (), когда я изменил «extends Activity» на «extends ListActivity», есть идеи, почему?

private TextView mSelection;
//private ImageView mImages;
static final String[] keywords = new String[]{"China", "Japan", "USA", "Canada"};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.contactLayout);

    mSelection = (TextView)findViewById(R.id.ContactNames);
    ArrayAdapter adapter = new ArrayAdapter<String>(this, R.layout.contactlayout, R.id.ContactNames,keywords);
    setListAdapter(adapter);
    }

Мой макет из этой статьи: http://www.curious -creature.org / 2009/02/22 / android-layout-tricks-1 /

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="?android:attr/listPreferredItemHeight"

android:padding="6dip">

<ImageView
    android:id="@+id/icon"

    android:layout_width="wrap_content"
    android:layout_height="fill_parent"
    android:layout_marginRight="6dip"

    android:src="@drawable/icon" />

<LinearLayout
    android:orientation="vertical"

    android:layout_width="0dip"
    android:layout_weight="1"
    android:layout_height="fill_parent">

    <TextView
        android:id="@+id/ContactNames"
        android:layout_width="fill_parent"
        android:layout_height="0dip"
        android:layout_weight="1"

        android:gravity="center_vertical"
        android:text="My Application" />

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="0dip"
        android:layout_weight="1" 

        android:singleLine="true"
        android:ellipsize="marquee"
        android:text="Simple application that shows how to use RelativeLayout" />

</LinearLayout>

Ответы [ 3 ]

11 голосов
/ 31 марта 2010

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

(main.xml)
<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:cacheColorHint="#00000000"
    android:id="@android:id/list">
</ListView>

Обратите внимание на очень важную строку android:id="@android:id/list".Вы должны иметь это в своем ListView, поскольку именно это сообщает Android, где находится ваш список.CacheColorHint полезен, если ваш фон не черный - для получения более подробной информации см. этот пост .

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

public class TestProject extends ListActivity {

    final static String[] ITEMS = {"blah", "floop", "gnarlp", "stuff"};

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                R.layout.listrow, R.id.textview, ITEMS);
        setListAdapter(adapter);
    }
}

Тогда макет списка будет следующим:

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

    <TextView android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/textview"/>
</LinearLayout>

Это действительно простой макет.Если вы хотите получить что-то более сложное, изменения должны состоять в использовании BaseAdapter, так как он дает вам вызовы getView(...) перед каждой строкой.В этом вы можете использовать разные макеты в зависимости от содержимого каждой строки.Тем не менее, BaseAdapter выглядит страшно, когда вы впервые попробуйте, так что будьте осторожны!:)

1 голос
/ 31 марта 2010

Да, если вы используете ListActivity, вам нужно иметь ListView с идентификатором android.R.list в файле макета.

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

0 голосов
/ 25 августа 2010

На самом деле, ваш (пользовательский) макет не нуждается в ListView при использовании действия списка .Самый простой способ решить эту проблему - просто удалить строку setContentView ().Проще говоря, когда вы это делаете, Android «принимает» макет, который вы используете, чтобы он содержал один полноэкранный ListView, и предоставляет его вам.

Если вам нужен другой (более богатый) интерфейс дляАктивность, однако, вы должны кодировать XML и использовать информированный идентификатор для Android, чтобы знать, как в конце концов отобразить список, подразумеваемый активностью, являющейся ListActivity.Обратите внимание, что макет для элемента не совпадает со списком, и, хотя я не пробовал этого, я предполагаю, что вы можете иметь собственный макет элемента без явного ListView в макете действия.

...