操作栏福尔摩斯NAVIGATION_MODE_LIST - dropdownListPreferredItemHeight忽略

问题描述:

我使用的操作栏福尔摩斯与导航模式NAVIGATION_MODE_LIST定制微调适配器操作栏福尔摩斯NAVIGATION_MODE_LIST - dropdownListPreferredItemHeight忽略

问题是,下拉列表视图看起来受到挤压,项目的高度显示为具有wrap_content而不是固定的高度。 (this is how it looks

按照* abs_themes *,高度应48dip:

<item name="dropdownListPreferredItemHeight">48dp</item> 

如果我使用它正常工作的资源创造了一个非自定义微调适配器,我缺少什么?这里一个样本代码,我写道:

MainActivity.java

package com.example.themetest; 

import android.content.Context; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.SpinnerAdapter; 
import android.widget.TextView; 
import android.widget.Toast; 

import com.actionbarsherlock.app.ActionBar; 
import com.actionbarsherlock.app.ActionBar.OnNavigationListener; 
import com.actionbarsherlock.app.SherlockActivity; 

public class MainActivity extends SherlockActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    ActionBar actionBar = getSupportActionBar(); 
    actionBar.setDisplayShowTitleEnabled(false); 
    actionBar.setDisplayHomeAsUpEnabled(true); 
    actionBar.setDisplayUseLogoEnabled(true); 
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); 

    final String[] choices = {"Android", "iOS", "RIM"}; 
    CustomSpinnerAdapter customSpinnerAdapter = new CustomSpinnerAdapter(MainActivity.this, android.R.id.text1, choices); 
    actionBar.setListNavigationCallbacks(customSpinnerAdapter, new OnNavigationListener() { 
     @Override 
     public boolean onNavigationItemSelected(int itemPosition, long itemId) { 
      Toast.makeText(MainActivity.this, choices[itemPosition], Toast.LENGTH_SHORT).show(); 
      return false; 
     } 
    }); 

//  this works properly 
//  actionBar.setListNavigationCallbacks(ArrayAdapter.createFromResource(this,  R.array.sections, R.layout.sherlock_spinner_dropdown_item), 
//    new OnNavigationListener() { 
//     public boolean onNavigationItemSelected(int itemPosition, long itemId) { 
//      return false; 
//     } 
//  }); 
} 

private class CustomSpinnerAdapter extends ArrayAdapter<String> implements SpinnerAdapter { 
    private LayoutInflater layoutInflater; 

    public CustomSpinnerAdapter(Context context, int textViewResourceId, String[] values) { 
     super(context, textViewResourceId, values); 
     this.layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     return initView(position, convertView); 
    } 

    @Override 
    public View getDropDownView(int position, View convertView, ViewGroup parent) { 
     return initView(position, convertView); 
    } 

    private View initView(int position, View convertView) { 
     if (convertView == null) { 
      convertView = layoutInflater.inflate(R.layout.sherlock_spinner_dropdown_item, null); 
     } 
     ((TextView) convertView.findViewById(android.R.id.text1)).setText(getItem(position)); 
     return convertView; 
    } 
} 

} 

styles.xml

<resources> 
    <style name="Theme.AppTheme" parent="Theme.Sherlock.Light" /> 
</resources> 

的manifest.xml

<uses-sdk 
    android:minSdkVersion="8" 
    android:targetSdkVersion="17" /> 

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/Theme.AppTheme" > 
    <activity 
     android:name="com.example.themetest.MainActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

+0

是什么'AppTheme'从延长? – 2013-04-03 22:12:56

+0

我通过创建一个类'public class CustomCursorAdaptor extends SimpleCursorAdapter'来做同样的事情,为什么你要使用'CustomSpinnerAdaptor'? – Mangusto 2013-04-03 22:16:27

+0

@JakeWharton Theme.Sherlock.Light – gwa 2013-04-03 22:19:23

你不通过parentinflate()方法。这应该是高度被忽略的原因。

layoutInflater.inflate(R.layout.sherlock_spinner_dropdown_item, parent, false); 

代替

layoutInflater.inflate(R.layout.sherlock_spinner_dropdown_item, null); 

实施getView()getDropDownView()这样的:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    if (convertView == null) { 
     convertView = layoutInflater.inflate(
       R.layout.sherlock_spinner_item, parent, false); 
    } 
    ((TextView) convertView.findViewById(android.R.id.text1)) 
      .setText(getItem(position)); 
    return convertView; 
} 

@Override 
public View getDropDownView(int position, View convertView, ViewGroup parent) { 
    if (convertView == null) { 
     convertView = layoutInflater.inflate(
       R.layout.sherlock_spinner_dropdown_item, parent, false); 
    } 
    ((TextView) convertView.findViewById(android.R.id.text1)) 
      .setText(getItem(position)); 
    return convertView; 
} 
+1

f *** ...........! – gwa 2013-04-03 23:16:49

+4

你也只实现'getView'而不是'getDropDownView'。默认情况下,列表导航适配器使用两个视图。一个用于显示在操作栏中的当前所选视图和另一个(弹出窗口中引用的下拉视图)。 – 2013-04-04 01:31:11

+0

谢谢,我完全错过了这里。我将它添加到答案中。 – 2013-04-04 17:08:41