1

私は Android プログラミングの Big Nerd Ranch ガイドに取り組んでおり、第 16 章の課題に取り組んでいます。課題は、ListView の EmptyView を作成し、EmptyView に何かを追加するボタンを作成することです。EmptyView を機能させましたが、ボタンをどこに作成すればよいかわかりません。これが私のコードです。

public View onCreateView(LayoutInflater inflater, ViewGroup parent, 
Bundle savedInstanceState) {
View v= super.onCreateView(inflater, parent, savedInstanceState);
inflater.inflate(R.layout.list_frame_layout, parent);

return v;
}

ここに私のXMLがあります。

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

<ListView
android:id="@android:id/list"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >

</ListView>

<LinearLayout android:id="@android:id/empty"
android:layout_width="match_parent"
android:layout_height="match_parent" 
android:orientation="vertical"
android:gravity="center">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="24dp"
android:text="@string/empty_no_crime" />

<Button
android:id="@+id/empty_new_crime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/empty_new_crime">     
</Button>
</LinearLayout>
</FrameLayout>

この本では、フラグメントを使用するように指示されているため、インフレートします。コードは

mNewCrime=(Button)getView().findViewById(R.id.empty_new_crime)

しかし、それは機能していません。何か案は?

編集*:うーん、どうやらこれも実際にはうまく機能していないようです。何かを追加しても、EmptyView は消えず、アイテムがリストされている間は押し下げられます。ものを追加するとすぐに EmptyView をなくす方法についてのアイデアはありますか?

4

2 に答える 2

0

私も最初はこれに苦労し、基本的に上記のポスターと同じ方法で解決しました。しかし、私の問題は少し異なっていました。onClick リスナーをセットアップするコードが次のようになったため、起動時にアプリケーションから爆破されていました。

Button mCrimeButton = (Button)v.findViewById(R.id.crime_button);
mCrimeButton.setOnClickListener(new View.OnClickListener(){
    public void onClick(View v) {
        initiateCrimeRecord();
    }
});

mCrimeButton の宣言をクラス レベルに移動して、クラスのインスタンス変数にするまで、アプリを正常に実行できませんでした。

public class CrimeListFragment extends ListFragment {
    private static final String TAG = "CrimeListFragment";
    private ArrayList<Crime> mCrimes;
    private boolean mSubtitleVisible;
    private Button mCrimeButton;
    *
    *
    *

@TargetApi(11)
@Override

public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_empty_crime_list, parent, false);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        if ( mSubtitleVisible) {
            getActivity().getActionBar().setSubtitle(R.string.subtitle);
        } else {
            getActivity().getActionBar().setSubtitle(null);
        }

    }

    // Set the button up on the empty view
    mCrimeButton = (Button)v.findViewById(R.id.crime_button);
    mCrimeButton.setOnClickListener(new View.OnClickListener(){
        public void onClick(View v) {
            initiateCrimeRecord();
        }
    });

    return v;
}

その後、本書の他のすべての例で、操作されるウィジェットがクラスのプライベート インスタンスとして宣言されていることに気付きました。どうしてこれなの?Android では、ローカル インスタンスを取得してリスナーをアタッチすることはできませんか?

于 2014-12-03T16:48:17.173 に答える