2013-07-09 3 views
1

Я разрабатываю Android-приложение с раздвижным меню.Имеет ли ListActivity действие?

Я создал пользовательский класс для использования в ListFragment, чтобы показать пункты меню:

public class MenuItem 
{ 
    /** 
    * Title to show on sliding menu. 
    */ 
    private String title; 
    /** 
    * Activity to start when user select a menu item. 
    */ 
    private Class<Activity> activityClass; 

    public String getTitle() { 
     return title; 
    } 
    public void setTitle(String title) { 
     this.title = title; 
    } 
    public Class<Activity> getActivityClass() { 
     return activityClass; 
    } 
    public void setActivityClass(Class<Activity> activityClass) { 
     this.activityClass = activityClass; 
    } 
} 

Это мой ListFragment:

import java.util.ArrayList; 

import android.app.Activity; 
import android.os.Bundle; 
import android.support.v4.app.ListFragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

import com.com.msx.R; 
import com.com.msx.adapters.MenuAdapter; 
import com.com.msx.menu.MenuItem; 

public class MenuFragment extends ListFragment 
{ 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) 
    { 
     return inflater.inflate(R.layout.menu_list, null); 
    } 

    public void onActivityCreated(Bundle savedInstanceState) 
    { 
     super.onActivityCreated(savedInstanceState); 

     ArrayList<MenuItem> menuItems = getMenuItems(); 

     MenuAdapter adapter = new MenuAdapter(getActivity(), 
       R.layout.menu_row, menuItems); 
     setListAdapter(adapter); 
    } 

    /** 
    * Get menu items to show on Sliding menu. 
    * @return 
    */ 
    private ArrayList<MenuItem> getMenuItems() 
    { 
     String[] titles = { 
       getActivity().getString(R.string.menu_item_my_lovers), 
       getActivity().getString(R.string.menu_item_my_friends), 
       getActivity().getString(R.string.menu_item_geo_sex_locator), 
       getActivity().getString(R.string.menu_item_sex_affinity), 
       getActivity().getString(R.string.menu_item_messages), 
       getActivity().getString(R.string.menu_item_statistics) 
     }; 

     // TODO: Add icons for each menu item. 
     ArrayList<Class<? extends Activity>> activities = new ArrayList<Class<? extends Activity>>(titles.length); 
     activities.add(SelectFriendsActivity); 

     ArrayList<MenuItem> items = new ArrayList<MenuItem>(titles.length); 
     for(int i = 0; i < titles.length; i++) 
     { 
      MenuItem item = new MenuItem(); 
      item.setTitle(titles[i]); 
      // TODO: Set icon. 
      items.add(item); 
     } 

     return items; 
    } 
} 

И теперь, я пытаюсь заполнить ListFragment Листа адаптер с пользовательским номером ArrayAdapter. Но когда я пытаюсь сделать это:

ArrayList<Class<Activity>> activities = new ArrayList<Class<Activity>>(titles.length); 
activities.add((Class<Activity>)SelectFriendsActivity.class); 

я получаю эти ошибки два компилятора:

Cannot cast from Class<SelectFriendsActivity> to Class<Activity>  
SelectFriendsActivity cannot be resolved to a type 

Если я это сделать:

ArrayList<Class<? extends Activity>> activities = new ArrayList<Class<? extends Activity>>(titles.length); 
activities.add(SelectFriendsActivity.class); 

Я получаю эту ошибку компилятора:

The method add(Class<? extends Activity>) in the type ArrayList<Class<? extends Activity>> 
is not applicable for the arguments (Class<SelectFriendsActivity>) 

SelectFriendsActivity имеет этот прото Тип:

public class SelectFriendsActivity extends android.app.ListActivity 

Но если я изменю SelectFriendsActivity.class для MainActivity.class (который расширяет активность) это работает!

Что происходит?

+0

Declare 'Список л = новый ArrayList ()', 'не ArrayList л = ...' – fge

ответ

5

Why [am I] having these errors?

Поскольку Activity.class не равна SelectFriendsActivity.class.

Вы должны объявить List<Class<? extends Activity>> вместо ArrayList<Class<Activity>>.

свидетель Этот фрагмент кода:

final List<Class<? extends Number>> list 
     = new ArrayList<Class<? extends Number>>(); 

    // Both Integer and BigDecimal extend Number 
    list.add(Integer.class); 
    list.add(BigDecimal.class); 

Аналогичным образом, в MenuItem, ваш/сеттер/геттер членом экземпляр должен возвращать/иметь в качестве аргумента/быть типа Class<? extends Activity>. Предложение: отбросьте сеттеры, создайте MenuItem прямо, таким образом вы можете сделать его неизменным. В настоящее время ваш класс MenuItem - не потокобезопасный из-за этих взорванных сеттеров. Джавабеи вообще не являются потокобезопасными.

Is there a better way to know which Activity I have to start when user selects a menu item?

Не уверен, так как вы не показываете достаточно кода. Почему вы возвращаете класс, а не полностью сконструированный экземпляр, для начинающих?

+0

Спасибо за ваш ответ, но он не работает. Я обновил свой вопрос с подробностями о том, что происходит сейчас. – VansFannel

+0

Ум, вы действительно не показываете достаточно кода, так как это должно работать нормально. Что это за класс «ListActivity»? – fge

+0

Это 'android.app.ListActivity'. – VansFannel

Смежные вопросы