2013-11-13 2 views
1

У меня проблема с заклинателем ActionBar. Я использую ActionBarCompat. Я вижу вопрос о Gingerbread, JB и KK.ActionBarCompat Spinner не работает

Вот моя активность:

public class WikiActivity extends ActionBarActivity implements ActionBar.OnNavigationListener { 
    protected ArrayList<Project> mProjects; 
    protected ArrayAdapter<Project> mAdapter; 
    public int mCurrentProjectPosition; 

    @Override 
    public void onCreate(final Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     initProjectsSpinner(savedInstanceState); 
    } 

    @Override 
    public boolean onOptionsItemSelected(final MenuItem item) { 
     L.d("item" + item); 
     switch (item.getItemId()) { 
     case android.R.id.home: 
      NavUtils.navigateUpFromSameTask(this); 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     refreshProjectsList(); 
    } 

    private void initProjectsSpinner(Bundle savedInstanceState) { 
     mCurrentProjectPosition = -1; 
     if (savedInstanceState == null) { 
      mProjects = new ArrayList<Project>(); 
      mAdapter = new ProjectsSpinnerAdapter(this, R.layout.main_nav_item, mProjects); 
     } 
    } 

    private void enableListNavigationMode() { 
     L.d("current proj pos=" + mCurrentProjectPosition); 
     final ActionBar ab = getSupportActionBar(); 
     ab.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); 
     ab.setListNavigationCallbacks(mAdapter, this); 
     if (mCurrentProjectPosition >= 0) { 
      ab.setSelectedNavigationItem(mCurrentProjectPosition); 
     } 
    } 

    public void refreshProjectsList() { 
     L.d(""); 
     if (mProjects != null && mProjects.size() > 0) { 
      return; 
     } 
     L.d(""); 
     Project p = new Project(); 
     p.name = "test1"; 
     mProjects.add(p); 
     p = new Project(); 
     p.name = "test2"; 
     mProjects.add(p); 
     p = new Project(); 
     p.name = "test3"; 
     mProjects.add(p); 
     p = new Project(); 
     p.name = "test4"; 
     mProjects.add(p); 

     enableListNavigationMode(); 
    } 

    @Override 
    public boolean onNavigationItemSelected(final int itemPosition, final long itemId) { 
     L.d("position: " + itemPosition); 
     if (mProjects == null || itemPosition < 0 || itemPosition > mProjects.size()) { 
      return true; 
     } 

     mCurrentProjectPosition = itemPosition; 
     Project currentProject = mProjects.get(mCurrentProjectPosition); 
     L.d("currentProject=" + currentProject); 

     return true; 
    } 
} 

Вот адаптер. Я согласен, что это может быть улучшено (например, с использованием владельца представлений), но это не проблема.

public class ProjectsSpinnerAdapter extends ArrayAdapter<Project> { 
    ArrayList<Project> data; 
    LayoutInflater inflater; 
    public ProjectsSpinnerAdapter(final Context ctx, final int textViewResourceId, final ArrayList<Project> data) { 
     super(ctx, textViewResourceId, data); 
     this.data = data; 
     inflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    @Override 
    public View getView(final int position, View convertView, final ViewGroup parent) { 
     if (convertView == null) { 
      convertView = inflater.inflate(R.layout.main_nav_item_in_actionbar, null); 
     } 
     final TextView text = (TextView) convertView.findViewById(R.id.main_nav_ab_item_text); 
     if (text != null && data != null && position < data.size()) { 
      text.setText(data.get(position).name); 
     } 
     return convertView; 
    } 

    @Override 
    public View getDropDownView(final int position, View convertView, final ViewGroup parent) { 
     if (convertView == null) { 
      convertView = inflater.inflate(R.layout.main_nav_item, null); 
     } 
     final TextView text = (TextView) convertView.findViewById(R.id.main_nav_item_text); 
     final View image = convertView.findViewById(R.id.main_nav_item_icon); 
     if (text != null && image != null) { 
      text.setText(data.get(position).name); 
      image.setVisibility(View.INVISIBLE); 
     } 
     return convertView; 
    } 

    @Override 
    public int getCount() { 
     return data == null ? 0 : data.size(); 
    } 

    @Override 
    public Project getItem(final int position) { 
     return null; 
    } 

    @Override 
    public long getItemId(final int position) { 
     return 0; 
    } 
} 

Так что на самом деле это довольно просто. Мой код намного сложнее, но я мог бы свести его к этому, и он все еще терпит неудачу. Он работал отлично с ABS, а не с тем, что я переключился на ActionBarCompat, он больше не работает.

Когда я касаюсь счетчика в панели действий, ничего не происходит. Он не разворачивается. Что не так?

Вот лог:

--- ProjectsSpinnerAdapter.java:25 ProjectsSpinnerAdapter::<init>() --- 
Context: [email protected], textViewResourceId: 2130903113, data: [] 
--- WikiActivity.java:65 WikiActivity::refreshProjectsList() --- 
--- WikiActivity.java:69 WikiActivity::refreshProjectsList() --- 
--- WikiActivity.java:54 WikiActivity::enableListNavigationMode() --- 
current proj pos=-1 
--- ProjectsSpinnerAdapter.java:66 ProjectsSpinnerAdapter::getCount() --- 
--- ProjectsSpinnerAdapter.java:66 ProjectsSpinnerAdapter::getCount() --- 
--- ProjectsSpinnerAdapter.java:78 ProjectsSpinnerAdapter::getItemId() --- 
position: 0 
--- ProjectsSpinnerAdapter.java:78 ProjectsSpinnerAdapter::getItemId() --- 
position: 0 
--- ProjectsSpinnerAdapter.java:66 ProjectsSpinnerAdapter::getCount() --- 
--- ProjectsSpinnerAdapter.java:66 ProjectsSpinnerAdapter::getCount() --- 
--- ProjectsSpinnerAdapter.java:78 ProjectsSpinnerAdapter::getItemId() --- 
position: 0 
--- ProjectsSpinnerAdapter.java:78 ProjectsSpinnerAdapter::getItemId() --- 
position: 0 
--- WikiActivity.java:88 WikiActivity::onNavigationItemSelected() --- 
position: 0 
--- WikiActivity.java:95 WikiActivity::onNavigationItemSelected() --- 
currentProject=Project { id: 0, name: test1, identifier: null } 
--- ProjectsSpinnerAdapter.java:66 ProjectsSpinnerAdapter::getCount() --- 
--- ProjectsSpinnerAdapter.java:32 ProjectsSpinnerAdapter::getView() --- 
position: 0, convertView: null, parent: android.widget.Spinner{43163858 VFED.... ......I. 0,0-0,0 #1020261 android:id/action_bar_spinner} 
--- ProjectsSpinnerAdapter.java:66 ProjectsSpinnerAdapter::getCount() --- 
--- ProjectsSpinnerAdapter.java:32 ProjectsSpinnerAdapter::getView() --- 
position: 0, convertView: null, parent: android.widget.Spinner{43163858 VFED.... ......I. 0,0-0,0 #1020261 android:id/action_bar_spinner} 
--- ProjectsSpinnerAdapter.java:32 ProjectsSpinnerAdapter::getView() --- 
position: 1, convertView: android.widget.LinearLayout{42c86858 V.E..... ......I. 0,0-0,0}, parent: android.widget.Spinner{43163858 VFED.... ......I. 0,0-0, 
--- ProjectsSpinnerAdapter.java:32 ProjectsSpinnerAdapter::getView() --- 
position: 2, convertView: android.widget.LinearLayout{42c86858 V.E..... ......I. 0,0-0,0}, parent: android.widget.Spinner{43163858 VFED.... ......I. 0,0-0, 
--- ProjectsSpinnerAdapter.java:32 ProjectsSpinnerAdapter::getView() --- 
position: 3, convertView: android.widget.LinearLayout{42c86858 V.E..... ......I. 0,0-0,0}, parent: android.widget.Spinner{43163858 VFED.... ......I. 0,0-0, 
--- ProjectsSpinnerAdapter.java:66 ProjectsSpinnerAdapter::getCount() --- 
--- ProjectsSpinnerAdapter.java:32 ProjectsSpinnerAdapter::getView() --- 
position: 0, convertView: null, parent: android.widget.Spinner{43163858 VFED.... ......I. 0,0-0,0 #1020261 android:id/action_bar_spinner} 
--- ProjectsSpinnerAdapter.java:78 ProjectsSpinnerAdapter::getItemId() --- 
position: 0 
--- ProjectsSpinnerAdapter.java:78 ProjectsSpinnerAdapter::getItemId() --- 
position: 0 
--- ProjectsSpinnerAdapter.java:32 ProjectsSpinnerAdapter::getView() --- 
position: 0, convertView: null, parent: android.widget.Spinner{43163858 VFED.... ......ID 0,0-204,144 #1020261 android:id/action_bar_spinner} 
--- ProjectsSpinnerAdapter.java:78 ProjectsSpinnerAdapter::getItemId() --- 
position: 0 
--- ProjectsSpinnerAdapter.java:66 ProjectsSpinnerAdapter::getCount() --- 
--- ProjectsSpinnerAdapter.java:32 ProjectsSpinnerAdapter::getView() --- 
position: 0, convertView: null, parent: android.widget.Spinner{43163858 VFED.... ......ID 0,0-204,144 #1020261 android:id/action_bar_spinner} 
--- ProjectsSpinnerAdapter.java:66 ProjectsSpinnerAdapter::getCount() --- 
--- ProjectsSpinnerAdapter.java:32 ProjectsSpinnerAdapter::getView() --- 
position: 0, convertView: null, parent: android.widget.Spinner{43163858 VFED.... ......ID 0,0-204,144 #1020261 android:id/action_bar_spinner} 
--- ProjectsSpinnerAdapter.java:32 ProjectsSpinnerAdapter::getView() --- 
position: 1, convertView: android.widget.LinearLayout{42d3a630 V.E..... ......I. 0,0-0,0}, parent: android.widget.Spinner{43163858 VFED.... ......ID 0,0-20 
er} 
--- ProjectsSpinnerAdapter.java:32 ProjectsSpinnerAdapter::getView() --- 
position: 2, convertView: android.widget.LinearLayout{42d3a630 V.E..... ......I. 0,0-0,0}, parent: android.widget.Spinner{43163858 VFED.... ......ID 0,0-20 
er} 
--- ProjectsSpinnerAdapter.java:32 ProjectsSpinnerAdapter::getView() --- 
position: 3, convertView: android.widget.LinearLayout{42d3a630 V.E..... ......I. 0,0-0,0}, parent: android.widget.Spinner{43163858 VFED.... ......ID 0,0-20 
er} 
--- ProjectsSpinnerAdapter.java:78 ProjectsSpinnerAdapter::getItemId() --- 
position: 0 
--- ProjectsSpinnerAdapter.java:78 ProjectsSpinnerAdapter::getItemId() --- 
position: 0 

Тогда я постучал Вертушка несколько раз. Ничего. Затем я нажал кнопку «вверх» из панели действий:

--- WikiActivity.java:26 WikiActivity::onOptionsItemSelected() --- 
[email protected]78d8 

Действительно, на этом счетчике ничего не происходит. Это dead.

+0

- это ваше меню, используя что-то похожее на это? yourapp: actionViewClass = "android.support.v7.widget.SearchView" – Broak

+0

Да, но я не говорю о 'SearchView' здесь (который работает правильно, BTW). –

+0

Вызывается метод 'getDropDownView'? Можете ли вы пройти через это? – Szymon

ответ

1

Обнаружена проблема. Это из-за моей темы/стилей.

Вот тема приложение (одна деятельность использует):

<item name="actionDropDownStyle">@style/Theme.MyMine.DropDownNav</item> 
<item name="android:actionDropDownStyle">@style/Theme.MyMine.DropDownNav</item> 

Вот объявление стиля:

<style name="Theme.MyMine.DropDownNav"> 
    <item name="android:background">@drawable/spinner_background_ab_mymine</item> 
    <item name="android:popupBackground">@drawable/menu_dropdown_panel_mymine</item> 
    <item name="android:dropDownSelector">@drawable/selectable_background_mymine</item> 
</style> 

Вот неподвижная один: мне просто нужно добавить родителей. Это исправление для HC + устройств:

<style name="Theme.MyMine.DropDownNav" 
     parent="android:Widget.Holo.Light.Spinner"> 
    <item name="android:background">@drawable/spinner_background_ab_mymine</item> 
    <item name="android:popupBackground">@drawable/menu_dropdown_panel_mymine</item> 
    <item name="android:dropDownSelector">@drawable/selectable_background_mymine</item> 
</style> 
0

НИКОГДА не используйте NAVIGATION_MODE_LIST и onNavigationItemSelected это не стоит!

@Override общественного логический onNavigationItemSelected (INT позицию, долго Itemid)

Вы также не можете использовать меню, чтобы сделать это:.

@Override общественного логический onCreateOptionsMenu (меню Menu) {getMenuInflater() надуваться (R.menu.activity_main, меню);

из-за заказа инфляции. Причины:

(1) он генерирует «скрытый» счетчик, для которого вы не можете получить идентификатор. (2) вы не можете настроить этот счетчик (3), вы сохраняете 30 строк кода, но на постоянной основе ограничены, если вы хотите добавить второй двунаправленный счетчик (4) даже в специальный случай «простого кода» (один счетчик), вы теряете много. (5) вы не можете использовать вкладки. (6) Зачем вам не нужен подобный код?

ключ - действиеBar.setCustomView (R.layout.action_bar_custom); и spinner.setOnItemSelectedListener (новый AdapterView.OnItemSelectedListener() ... для каждого счетчика. Поверьте мне, я потерял часы, пытаясь решить каждое решение.

+0

Зачем вы это делаете? Пожалуйста остановись. –

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