为EmptyView android设置onClickListener按钮

时间:2013-05-31 07:15:24

标签: android android-listview android-fragments android-button

我正在研究用于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消失的任何想法都会消失吗?

2 个答案:

答案 0 :(得分:1)

我最初也遇到了这个挑战的麻烦。我过度思考了!你现在可能已经解决了这个问题,但我认为为别人发布答案会很有用。以下对我有用:

  1. 创建一个新的XML文件,指定已经完成的“空”和“列表”视图。

  2. 修改现有的onCreateView方法,以扩充新修改的布局,其中包含您在XML中定义的“空”和“列表”视图。

  3. 创建一个新按钮并为按钮设置onClickListener。

  4. 以下是代码:

    @TargetApi(11)
    @Override
    // We override the onCreateView to set the subtitle by default if we are rocking >3.0 
    public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState)
    {
        super.onCreateView(inflater, parent, savedInstanceState);   
    
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){
            if(mSubtitleVisible){
                getActivity().getActionBar().setSubtitle(R.string.subtitle);
            }// End inner if
        }// End if
    
        View v = inflater.inflate(R.layout.empty_layout, parent, false);
    
        mNewCrimeButton = (Button)v.findViewById(R.id.add_crime);
        //Define an click event listener for the button and launch the new crime fragment when clicked
        mNewCrimeButton.setOnClickListener(new View.OnClickListener(){
                    public void onClick(View v){
                        Crime crime = new Crime();
                        //Get the crimelab from the activity and add the crime
                        CrimeLab.get(getActivity()).addCrime(crime); //getActivity returns the activity this fragment is attached to
                        Intent i = new Intent(getActivity(), CrimePagerActivity.class);
                        startActivityForResult(i,0);
                    }//End onClick
                });
    
        return v;
    }// End onCreateView 
    

    这应该适用于您现有的xml布局。我希望这有帮助。

答案 1 :(得分: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不允许您只是获取本地实例来附加监听器吗?