2010-03-31 2 views
3

[업데이트] 콘텐츠에 'android.R.id.list'라는 id 속성이있는 ListView가 있어야합니다. 내 XML에 분명히 아무것도 ListView입니다. 그러나 그것이 필요한가? Android : ListActivity로 전환 할 때 setContentView를 사용하지 못했습니다.

내 앞의 질문 내가있는 LinearLayout에 대한 목록보기 만드는 방법에 대한 문서를 읽어 android: which view should I use for showing text and image?

에 후속 문제입니다. 그러나, 내 다음 코드는 setContentView() 함수에서 "extends Activity"를 "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); 
    } 

내 레이아웃이 문서에서있다 : 당신이 ListActivity를 사용하는 경우 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> 

답변

11

이전 질문에서 내가 보여준 다른 게시물을 오해 한 것 같습니다. 그들은 활동의 전체 레이아웃 파일을 정의하는 방법이 아니라 목록의 각 행에 맞춤 레이아웃을 사용하는 방법을 설명하고있었습니다. 다음과 같은 것이 필요합니다.

(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에있는 것이어야합니다. 안드로이드가 당신의리스트가 어디에 있는지 알려주는 것입니다. cacheColorHint는 배경이 검은 색이 아닌 경우에 유용합니다. 자세한 내용은 this post을 참조하십시오.

위의 줄을 사용하여 활동을 올바르게 인식 할 수있는 목록을 제공 할 수 있습니다. 여기에 기본 예제 :

<?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> 

이 정말 간단한 레이아웃입니다 :

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); 
    } 
} 

그런 다음 listrow 레이아웃은 이것이다. 좀 더 복잡한 것을 얻으려면 BaseAdapter를 사용해야합니다. 그러면 각 행 앞에 getView(...)이 호출됩니다. 따라서 각 행의 내용에 따라 다른 레이아웃을 사용할 수 있습니다. 그러나 BaseAdapter는 처음 시도 할 때 무서워 보이므로주의해야합니다! :)

+0

감사합니다. 시도해 보니 항목 목록이 나타납니다. 그러나이 경우 텍스트가 모두 비어있는 이유는 무엇입니까? – Yang

+0

그들은 나를 위해 비어 있지 않았다 ... 위 코드를 업데이트 할 수 있습니까? ArrayAdapter adapter = new ArrayAdapter (this, R.layout.contactlayout, R.id.ContactNames, keywords);'여전히 라인을 사용하고 있다면 오류 일 것입니다. 내가 사용했던 것은 잘 작동했다. 온라인으로 게시하기 전에 테스트를 확실히했다. –

+0

흥미 롭습니다! 레이아웃을 사용하면 텍스트가 비어 있지 않습니다. 그러나 위에 나열된 레이아웃이 비어 있습니다! 왜 그런가? – Yang

1

예, 당신은 ID가 레이아웃 파일에 android.R.list 인의 ListView가 있어야합니다.

레이아웃에서 ListView를 사용하지 않고 거기에 표시되지 않으면 일반 Activity를 사용하도록 전환하십시오.

+0

Activity로 다시 설정하면 새 항목의 목록에 대해 setListAdapter를 어떻게 호출해야합니까? – Yang

+0

리스트 뷰가 없다면, setListAdapter()를 호출하기를 원하지 않는다. - 당신이 제공하는 어댑터를 표시하는리스트 뷰는 없다. – hackbod

+0

그러면 기본적으로이 고전적인 기사가 잘못되었다고 말하는 것입니까? http://www.androidguys.com/2008/07/14/fancy-listviews-part-one/ 각 아이콘과 텍스트를 모두 포함하는 항목의 목록보기를 만들려고합니다. – Yang

0

실제로 (사용자 지정) 레이아웃에는 목록 활동을 사용할 때 ListView가 필요하지 않습니다. 이 문제를 쉽게 해결할 수있는 방법은 setContentView() 라인을 모두 제거하는 것입니다. 간단히 말하면, 안드로이드는 하나의 전체 화면 ListView를 포함하기 위해 사용하고있는 레이아웃을 "가정"하고 그것을 제공합니다.

액티비티에 대해 다른 (더 풍부한) 인터페이스를 원한다면, XML을 코딩하고 안드로이드에 대한 정보 ID를 사용하여 어쨌든 ListActivity가되는 활동이 암시하는 목록을 표시하는 방법을 알아야합니다. 아이템의 레이아웃은리스트와 같지 않다는 것을 명심하십시오.하지만 그 레이아웃을 시도하지는 않았지만 액티비티 레이아웃에 명시적인 ListView가 없어도 커스텀 아이템 레이아웃을 가질 수 있다고 가정합니다.

관련 문제