web-dev-qa-db-ja.com

Android:ListActivityの上部に静的ヘッダーを追加する

現在、ListActivityクラスを拡張しているクラスがあります。常に表示されるいくつかの静的ボタンをリストの上に追加できるようにする必要があります。クラス内からgetListView()を使用してListViewを取得しようとしました。次に、addHeaderView(View)を使用して、画面の上部に小さなレイアウトを追加しました。

Header.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout  xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent" >
    <Button 
        Android:id="@+id/testButton"
        Android:layout_width="fill_parent" 
        Android:layout_height="wrap_content"
        Android:text="Income" 
        Android:textSize="15dip"
        Android:layout_weight="1" />
</LinearLayout>

アダプタを設定する前に、次のことを行います。

ListView lv = getListView();
lv.addHeaderView(findViewById(R.layout.header));

これにより、データベースからデータが取り込まれることを除いて、ListViewに何も起こりません。その上にボタンは表示されません。

ListViewの上部にパディングを追加してみた別のアプローチ。これを行うと、正常に下に移動しましたが、上に追加すると、ListViewがプッシュされました。 ListActivityを使用したときに、ListViewの上にいくつかのボタンを配置できないように思えます。

前もって感謝します。

synic、以前にあなたの提案を試しました。正気のためだけにもう一度試しましたが、ボタンは表示されませんでした。以下は、アクティビティのレイアウトファイルとoncreate()で実装したコードです。

//ヘッダーを追加しようとしているリストアクティビティ

public class AuditActivity extends ListActivity {

    Budget budget;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        Cursor test;
        super.onCreate(savedInstanceState);
        setContentView(R.layout.audit);
        ListView lv = getListView();
        LayoutInflater infalter = getLayoutInflater();
        ViewGroup header = (ViewGroup) infalter.inflate(R.layout.header, lv, false);
        lv.addHeaderView(header);
        budget = new Budget(this);
        /*
        try {
            test = budget.getTransactions();
            showEvents(test);
        } finally {

        }
        */
//      switchTabSpecial();
    }

アクティビティのLayout.xml:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent" Android:layout_height="fill_parent">
    <ListView Android:id="@Android:id/list" Android:layout_width="wrap_content"
        Android:layout_height="wrap_content" />
    <TextView Android:id="@Android:id/empty" Android:layout_width="wrap_content"
        Android:layout_height="wrap_content" Android:text="@string/empty" />
</LinearLayout>
46
crv

findViewById()は、オブジェクトViewのサブビューを見つけるためにのみ機能します。レイアウトIDでは機能しません。

Xmlを対応するViewコンポーネントに変換するには、レイアウトインフレータを使用する必要があります。このようなもの:

_ListView lv = getListView();
LayoutInflater inflater = getLayoutInflater();
View header = inflater.inflate(R.layout.header, lv, false);
lv.addHeaderView(header, null, false);
_

あなたのコードが単にエラーを投げていなかった理由がわかりません。 findViewById()はおそらくnullを返しているだけなので、ヘッダーはリストに追加されませんでした。

90
synic

最も簡単なソリューションは次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
 xmlns:Android="http://schemas.Android.com/apk/res/Android"
 Android:orientation="vertical"
 Android:layout_width="fill_parent"
 Android:layout_height="fill_parent"
 Android:background="@color/background">
 <include layout="@layout/actionbar"/>
   <ListView
    Android:id="@+id/tasklist_TaskListView"
    Android:layout_width="fill_parent"
    Android:layout_height="0dip"
    Android:layout_weight="1"
    Android:textColor="@color/baseFont"/>
   <include layout="@layout/bottombar"/>
</LinearLayout>

または

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
 xmlns:Android="http://schemas.Android.com/apk/res/Android"
 Android:orientation="vertical"
 Android:layout_width="fill_parent"
 Android:layout_height="fill_parent"
 Android:background="@color/background">
   <Button 
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"/>
   <ListView
    Android:id="@+id/tasklist_TaskListView"
    Android:layout_width="fill_parent"
    Android:layout_height="0dip"
    Android:layout_weight="1"
    Android:textColor="@color/baseFont"/>
   <Button 
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"/>

</LinearLayout>

ボタンの代わりに、別の水平線形レイアウトを追加できます

8
pcu

いくつかの調査の後、ListActivity XMLドキュメント内でTableLayoutとLinearLayoutを混在させると、ヘッダーをドキュメントに追加できることがわかりました。誰かがそれを見たいと思っているなら、以下は私のXML文書です。 synicのアプローチは、おそらく彼のソリューションで作業した後、おそらく正しいアプローチですが、私はそれを思いどおりに機能させることができませんでした。

AuditTab.Java

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.audittab);
        getListView().setEmptyView(findViewById(R.id.empty));
}

audittab.xml

<?xml version="1.0" encoding="utf-8"?>
<TableLayout 
    Android:layout_width="fill_parent"
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_height="fill_parent">
    <TableRow 
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent" 
        Android:layout_gravity="center_horizontal">
        <LinearLayout 
            xmlns:Android="http://schemas.Android.com/apk/res/Android"
            Android:layout_width="fill_parent" 
            Android:layout_height="fill_parent"
            Android:orientation="horizontal" 
            Android:layout_weight="1">
            <Button 
                Android:id="@+id/btnFromDate" 
                Android:layout_width="fill_parent"
                Android:layout_height="wrap_content" 
                Android:text=""
                Android:layout_weight="1" />
            <Button 
                Android:id="@+id/btnToDate" 
                Android:layout_width="fill_parent"
                Android:layout_height="wrap_content" 
                Android:text=""
                Android:layout_toRightOf="@+id/btnFromDate"
                Android:layout_weight="1" />
            <Button 
                Android:id="@+id/btnQuery" 
                Android:layout_width="fill_parent"
                Android:layout_height="wrap_content" 
                Android:text="Query"
                Android:layout_toRightOf="@+id/btnToDate"
                Android:layout_weight="1" />

        </LinearLayout>
    </TableRow>
    <TableRow 
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent" 
        Android:layout_gravity="center_horizontal">
        <LinearLayout 
            Android:layout_width="fill_parent"
            Android:layout_height="fill_parent">
            <ListView 
                Android:id="@Android:id/list"
                Android:layout_width="300dip" 
                Android:layout_height="330dip"
                Android:scrollbars="none" />
            <TextView 
                Android:id="@+id/empty"
                Android:layout_width="wrap_content" 
                Android:layout_height="wrap_content"
                Android:paddingTop="10dip"
                Android:text="- Please select a date range and press query." />
        </LinearLayout>
    </TableRow>
</TableLayout>

AuditItem.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
        xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:layout_width="fill_parent" 
        Android:orientation="horizontal" 
        Android:padding="10sp">
    <TextView 
        Android:id="@+id/transactionDateLabel" 
        Android:layout_width="wrap_content" 
        Android:layout_height="wrap_content" 
        Android:text="Date: " />
    <TextView 
        Android:id="@+id/transactionDate" 
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content" 
        Android:layout_toRightOf="@id/transactionDateLabel" />
    <TextView 
        Android:id="@+id/transactionTypeLabel" 
        Android:layout_below="@id/transactionDate" 
        Android:layout_width="wrap_content" 
        Android:layout_height="wrap_content" 
        Android:text="Type: " />
    <TextView 
        Android:id="@+id/transactionType" 
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content" 
        Android:layout_marginLeft="10dip" 
        Android:layout_below="@id/transactionDate"
        Android:layout_toRightOf="@id/transactionTypeLabel" />

    <TextView 
        Android:id="@+id/transactionAmountLabel" 
        Android:layout_width="wrap_content" 
        Android:layout_height="wrap_content" 
        Android:layout_marginLeft="10dip"
        Android:text="Amount: " 
        Android:layout_below="@id/transactionDate"
        Android:layout_toRightOf="@id/transactionType" />
    <TextView 
        Android:id="@+id/transactionAmount" 
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content" 
        Android:layout_below="@id/transactionDate"
        Android:layout_toRightOf="@id/transactionAmountLabel" />
    <TextView 
        Android:id="@+id/transactionCategoryLabel" 
        Android:layout_width="wrap_content" 
        Android:layout_height="wrap_content" 
        Android:text="Category: " 
        Android:layout_below="@id/transactionAmountLabel" />
    <TextView 
        Android:id="@+id/transactionCategory" 
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_below="@id/transactionAmountLabel" 
        Android:layout_toRightOf="@id/transactionCategoryLabel"
        />
    <TextView 
        Android:id="@+id/transactionToAccountLabel" 
        Android:layout_width="wrap_content" 
        Android:layout_height="wrap_content" 
        Android:text="To Account: " 
        Android:layout_below="@id/transactionCategoryLabel" />
    <TextView
        Android:id="@+id/transactionToAccount"
        Android:layout_width="wrap_content" 
        Android:layout_height="wrap_content"
        Android:layout_below="@+id/transactionCategoryLabel"
        Android:layout_toRightOf="@id/transactionToAccountLabel" />
    <TextView 
        Android:id="@+id/transactionFromAccountLabel" 
        Android:layout_width="wrap_content" 
        Android:layout_height="wrap_content" 
        Android:text="From Account: " 
        Android:layout_below="@id/transactionToAccountLabel" />
    <TextView
        Android:id="@+id/transactionFromAccount"
        Android:layout_width="wrap_content" 
        Android:layout_height="wrap_content"
        Android:layout_below="@id/transactionToAccountLabel"
        Android:layout_toRightOf="@id/transactionFromAccountLabel" />
    <TextView 
        Android:id="@+id/transactionNoteLabel" 
        Android:layout_width="wrap_content" 
        Android:layout_height="wrap_content" 
        Android:text="Note: " 
        Android:layout_below="@id/transactionFromAccountLabel" />
    <TextView 
        Android:id="@+id/transactionNote" 
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content" 
        Android:layout_below="@id/transactionFromAccountLabel" 
        Android:layout_toRightOf="@id/transactionNoteLabel" />
    <Button 
        Android:id="@+id/editTransactionBtn" 
        Android:layout_width="wrap_content"
        Android:layout_height="40sp" 
        Android:visibility="gone" 
        Android:text="Edit"
        Android:layout_below="@id/transactionNoteLabel"/>
    <Button 
        Android:id="@+id/deleteTransactionBtn" 
        Android:layout_width="wrap_content"
        Android:layout_height="40sp" 
        Android:text="Delete" 
        Android:layout_below="@+id/transactionNoteLabel" 
        Android:visibility="gone" 
        Android:layout_toRightOf="@+id/editTransactionBtn" 
        Android:ellipsize="end"/>
</RelativeLayout>
7
crv

上記のListViewの回答は便利ですが、リストでスクロールし、ヘッダーのグラフィックを上部に保持しません。私が見つけた最良の解決策は、アクティビティにカスタムタイトルを設定することです。コンストラクターは次のようになります。

public void onCreate(Bundle savedInstanceState) {
    requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
    setContentView(R.layout.your_listview_layout);
    getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.your_header);
    ...

Your_listview_layout.xmlがListViewを構成し、your_header.xmlに任意のカスタムヘッダーレイアウトが含まれている場合。実行時の問題を引き起こさないために、上記の3行を正確にその順序で呼び出す必要があることに注意してください。

私を助けたチュートリアルは http://www.londatiga.net/it/how-to-create-custom-window-title-in-Android/ であり、Stackで多くの関連ページを見つけることができます「setFeatureInt」という用語を検索してオーバーフローする

4
Melinda Green

静的ヘッダーの追加は簡単です。alignParentTop(またはbottom、right、left)属性がtrueに設定された個別の相対ビューを作成するだけです。

0
rsfrost