2011-06-27 9 views
15

Tôi đang chuyển đổi một ứng dụng hiện có sang API phân đoạn bằng cách sử dụng thư viện tương thích. Tôi đã đọc rằng bạn phải cập nhật các lớp mở rộng Hoạt động để sử dụng FragmentActivity. Điều này là tốt cho hầu hết các trường hợp, nhưng những gì về các lớp học mở rộng ListActivity hoặc MapActivity? Cách ưu tiên để xử lý việc này là gì? Tôi đã hy vọng có một ListFragmentActivity hoặc một cái gì đó dọc theo những dòng, nhưng tôi không thấy một.Việc cần làm về ListActivity/MapActivity khi chuyển đổi thành Fragments bằng thư viện tương thích?

Trả lời

5

Có một ListFragment: http://developer.android.com/reference/android/app/ListFragment.html

Đối MapActivity, không may bạn sẽ cần phải tiếp tục sử dụng; không có API phân đoạn cho nó.

+2

Xin cảm ơn, nhưng ListFragment không phải là FragmentActivity, vì vậy tôi gặp vấn đề với cấu trúc kế thừa mong đợi một FragmentActivity. Tôi càng làm việc về điều này, càng có vẻ như nó sẽ cần viết lại toàn bộ, không chỉ cập nhật các loại lớp và các điều chỉnh nhỏ như Google đã xác nhận quyền sở hữu. – CACuzcatlan

+2

@CACuzcatlan: Bạn được hoan nghênh trích dẫn liên kết trong đó "Google" "tuyên bố" rằng tất cả những gì bạn cần là "chỉ cập nhật loại lớp và các điều chỉnh nhỏ". Điều đó đang được nói, việc chuyển đổi một 'ListActivity' thành một' ListFragment' khá đơn giản, đơn giản hơn hầu hết các hoạt động di chuyển fragment, IMHO. – CommonsWare

+0

Xin lỗi, tôi phóng đại. Tôi nên nói đó là ấn tượng tôi nhận được. – CACuzcatlan

8

Ít nhất cho ListActivity Bạn có thể thay đổi nó để FragmentActivity (Vẫn thực hiện OnItemCLickListener) và thay thế:

lv = getListView() để lv = (ListView) findViewById (R.id.your_list_view_id)

setListAdapter (favAdapter) để lv.setAdapter (adapter)

+2

Nếu ID của ListView của bạn là '@ android: id/list', bạn có thể làm điều này: 'ListView lv = (ListView) findViewById (android.R.id.list);'. Bạn cũng sẽ muốn thay thế 'onListItemClick()' bằng 'lv.setOnItemClickListener (new ListView.OnItemClickListener() {...' – bmaupin

+1

Tôi cũng đã nhận xét câu trả lời này bởi @bmaupin, nhưng chúng ta có thể tạo phương thức "getListView() "trả về" (ListView) findViewById (R.id.your_list_view_id) "và" setListAdapter (adapter) "mà" getListView(). setAdapter (adapter) "để xử lý những thứ đó hoặc nó sẽ không hoạt động? – ankushg

+0

Bạn sẽ tìm kiếm hệ thống phân cấp xem mỗi khi bạn gọi hàm getListView(), tuy nhiên, nó sẽ kém hiệu quả hơn. –

12

Đây là những gì tôi làm khi chuyển đổi một ListActivity để các mảnh vỡ API:

  1. Thay lv = getListView(); với lv = (ListView) findViewById(android.R.id.list);

  2. Thay setListAdapter(adapter); với lv.setAdapter(adapter);

  3. Nếu bạn đã overriden onListItemClick(), thay thế nó với lv.setOnItemClickListener(new ListView.OnItemClickListener() {...

  4. Bạn sẽ phải thiết lập các điểm trống (mà show khi không có kết quả) theo cách thủ công: lv.setEmptyView(findViewById(android.R.id.empty));

    Nếu tôi đang sử dụng CursorLoader, tôi thường đặt điều này trong onLoadFinished():

    // if there are no results 
    if (data.getCount() == 0) { 
        // let the user know 
        lv.setEmptyView(findViewById(android.R.id.empty)); 
    } else { 
        // otherwise clear it, so it won't flash in between cursor loads 
        lv.setEmptyView(null); 
    } 
    
  5. Nói về cursor loaders, tôi cũng sẽ chuyển đổi các hoạt động sử dụng CursorLoader nếu nó không phải là đã được điểm đó

+1

Có đủ để chỉ thêm phương thức mới getListView() vào FragmentActivity trả về ListView hay không và sau đó thêm một phương thức setListAdapter (adapter) khác gọi là setAdapter (adapter) vào hoạt động đó? – ankushg

+0

Giải pháp của bạn hoạt động hoàn hảo, thx 4 chia sẻ nó! – vinidog

+0

@Ankush cũng sẽ hoạt động. ng hệ thống phân cấp xem mỗi lần bạn gọi hàm getListView() mặc dù ít hiệu quả hơn. –

0

Có thể chuyển đổi ListActivity thành FragmentActivity.

  1. Mở rộng FragmentActivity thay vì ListActivity
  2. Tạo res/layout/your_activity.xml với một sản phẩm nào ListView với android:id="@+id/your_activity_list_view"
  3. Trong onCreate hoạt động của bạn, setContentView(R.layout.your_activity);
  4. Cũng thay đổi onCreate hoạt động của bạn để lấy ListView bạn một cách rõ ràng chỉ tăng cao

.

ListView lv = (ListView) findViewById(R.id.your_activity_list_view); 
lv.setAdapter(adapter); 
lv.setOnItemClickListener(this);