(重点关注Fragment)
1. 在SDK中建立一个新的名为ToDoList2的Android Application工程;
2. 在res/layout文件夹下创建一个新的布局文件new_item_fragment.xml,该文件包含一个EditText节点,输入以下内容:
<?xml version="1.0" encoding="utf-8"?> <EditText xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/myEditText" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/addItemHint" />
注意要在res/values/strings.xml中添加addItemHint的定义:
<string name="addItemHint">New To Do Item</string>
在src目录上点击右键-->New-->Class,在Name栏输入NewItemFragment,然后点击Finish。
在新创建的NewItemFragment.java中输入以下内容:
NewItemFragment.java:
package com.example.todolist2; import java.util.ArrayList; import android.app.Activity; import android.app.Fragment; import android.os.Bundle; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.EditText; import android.widget.ListView; /* myself fragment*/ public class NewItemFragment extends Fragment{ private OnNewItemAddedListener onNewItemAddedListener; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.new_item_fragment, container, false); final EditText myEditText = (EditText)rootView.findViewById(R.id.myEditText); myEditText.setOnKeyListener(new View.OnKeyListener() { public boolean onKey(View v, int keyCode, KeyEvent event) { // TODO Auto-generated method stub if (event.getAction() == KeyEvent.ACTION_DOWN) { if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER || keyCode == KeyEvent.KEYCODE_ENTER) { String newItem = myEditText.getText().toString(); onNewItemAddedListener.onNewItemAdded(newItem); myEditText.setText(""); return true; } } return false; } }); return rootView; } @Override public void onAttach(Activity activity) { super.onAttach(activity); try { onNewItemAddedListener = (OnNewItemAddedListener)activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement OnNewItemAddedListente"); } } public interface OnNewItemAddedListener{ public void onNewItemAdded(String newItem); } }分析:
a. 该类的onCreateView填充了一个new_item_fragment布局(第一步中说创建),并实现了该布局中EditText对象的按键监听事件setOnKeyListener();
b. 该类定义了一个接口OnNewItemAddedListener(用于接受to-do事项并添加到列表中),主界面通过实现该接口来监听新事项的添加;
c. 该类包含了一个OnNewItemAddedListener对象onNewItemAddedListener,这个变量用于在父Activity绑定到该Fragment时(onAttach方法)保存实现了这个接口的父Activity类的引用。
4. 创建一个ToDoListFragment类,用于包含to-do事项列表:
在src目录上点击右键-->New-->Class,在Name栏输入ToDoListFragment,然后点击Finish。
在新创建的ToDoListFragment.java中输入以下内容:
ToDoListFragment.java:
package com.example.todolist2; import android.app.ListFragment; public class ToDoListFragment extends ListFragment { }
备注: ListFragment包含一个ListView。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <fragment android:name="com.example.todolist2.NewItemFragment" android:id="@+id/NewItemFragment" android:layout_width="match_parent" android:layout_height="wrap_content" /> <fragment android:name="com.example.todolist2.ToDoListFragment" android:id="@+id/ToDoListFragment" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>
package com.example.todolist2; import android.app.Activity; import android.app.ActionBar; import android.app.Fragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.os.Build; import android.widget.ArrayAdapter; import java.util.ArrayList; import android.app.FragmentManager; public class MainActivity extends Activity implements NewItemFragment.OnNewItemAddedListener{ private ArrayAdapter<String> aa; private ArrayList<String> todoItems; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.todolist2_main); // 使用5中创建的布局
FragmentManager fm = getFragmentManager(); ToDoListFragment todoListFragment = (ToDoListFragment)fm.findFragmentById(R.id.ToDoListFragment); // 创建ArrayAdapter并将其绑定到listview上 todoItems = new ArrayList<String>(); aa = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, todoItems); todoListFragment.setListAdapter(aa); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } /** * A placeholder fragment containing a simple view. */ public static class PlaceholderFragment extends Fragment { public PlaceholderFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_main, container, false); return rootView; } } // 实现onNewItemAdded接口,接收收到的字符串变量并将其添加到ArrayList中 public void onNewItemAdded(String newItem) { todoItems.add(newItem); aa.notifyDataSetChanged(); } }