2016-07-10 3 views
2

ОБНОВЛЕНО
Я пытаюсь добавить Spinner к Toolbar программно. Итак, я написал следующий код: ToolbarSpinnerAdapter:панель не показывает Spinner

public class ToolbarSpinnerAdapter extends BaseAdapter { 

    public static final int NONE = -1; 

    private final LayoutInflater mInflater; 
    private List<String> mItems = new ArrayList<>(); 
    private int mSelectedPosition = NONE; 
    private Drawable mSelector; 

    public ToolbarSpinnerAdapter(Context context) { 
     mInflater = LayoutInflater.from(context); 
     mSelector = VectorDrawable.getDrawable(context, R.drawable.ic_done_green_24dp); 
     final int color = ContextCompat.getColor(context, R.color.primary); 
     mSelector.setColorFilter(new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_ATOP)); 
    } 

    public void setSelection(final int position) { 
     mSelectedPosition = position; 
    } 

    public int getSelection() { 
     return mSelectedPosition; 
    } 

    public void add(final String item) { 
     mItems.add(item); 
    } 

    public void addAll(String[] items) { 
     Collections.addAll(this.mItems, items); 
    } 

    @Override 
    public int getCount() { 
     return mItems.size(); 
    } 

    @Override 
    public Object getItem(final int position) { 
     return mItems.get(position); 
    } 

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

    @Override 
    public View getDropDownView(final int position, View view, ViewGroup parent) { 

     if (view == null || !view.getTag().toString().equals("DROPDOWN")) { 
      view = mInflater.inflate(R.layout.toolbar_spinner_dropdown_item, parent, false); 
      view.setTag("DROPDOWN"); 
     } 

     TextView textView = (TextView) view.findViewById(android.R.id.text1); 
     textView.setText(getTitle(position)); 

     if(position == mSelectedPosition) { 
      textView.setCompoundDrawablesWithIntrinsicBounds(null, null, mSelector, null); 
     } else { 
      textView.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null); 
     } 

     return view; 
    } 

    @Override 
    public View getView(final int position, View view, ViewGroup parent) { 

     if (view == null || !view.getTag().toString().equals("NON_DROPDOWN")) { 
      view = mInflater.inflate(R.layout.toolbar_spinner_item, parent, false); 
      view.setTag("NON_DROPDOWN"); 
     } 

     TextView textView = (TextView)view.findViewById(android.R.id.text1); 
     textView.setText(getTitle(position)); 

     return view; 
    } 

    private String getTitle(final int position) { 
     return mItems.get(position); 
    } 
} 

код использования:

protected void initToolbar(Toolbar toolbar) { 
    final MainActivity activity = (MainActivity) getActivity(); 
    activity.setSupportActionBar(toolbar); 
    mDrawerToggle = new ActionBarDrawerToggle(activity, activity.getDrawerLayout(), toolbar, R.string.app_name, R.string.app_name); 
    activity.getDrawerLayout().addDrawerListener(mDrawerToggle); 
    ActionBar actionBar = activity.getSupportActionBar(); 
    Context toolbarContext; 

    if (actionBar != null) { 
     actionBar.setDisplayHomeAsUpEnabled(true); 
     actionBar.setHomeButtonEnabled(true); 
     actionBar.setDisplayShowTitleEnabled(false); 
     mDrawerToggle.syncState(); 
     toolbarContext = activity.getSupportActionBar().getThemedContext(); 
    } else { 
     toolbarContext = getContext(); 
    } 

    mWeekSpinner = new Spinner(toolbarContext); 
    ToolbarSpinnerAdapter adapter = new ToolbarSpinnerAdapter(toolbarContext); 
    mWeekSpinner.setAdapter(adapter); 
    toolbar.addView(mWeekSpinner); 
    final String[] weekNames = WeekUtils.getWeekNames(getContext(), mTimetable.getWeekCount()); 
    adapter.addAll(weekNames); 
    final int currentWeek = WeekUtils.getCurrentWeek(mTimetable); 
    adapter.setSelection(currentWeek - 1); 
    mWeekSpinner.setSelection(currentWeek - 1); 
} 

Фрагмент макета XML:

<android.support.design.widget.CoordinatorLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".activity.MainActivity"> 

    <android.support.design.widget.AppBarLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="?attr/actionBarSize" 
      app:layout_scrollFlags="scroll|enterAlways"/> 

     <android.support.design.widget.TabLayout 
      android:id="@+id/tabs" 
      android:layout_width="match_parent" 
      android:layout_height="?attr/actionBarSize" 
      android:layout_gravity="bottom" 
      android:background="@drawable/bg_tabs" 
      app:tabGravity="fill" 
      app:tabIndicatorColor="@color/primary" 
      app:tabIndicatorHeight="6dp" 
      app:tabMode="scrollable" 
      app:tabSelectedTextColor="@color/primary" 
      app:tabTextColor="@color/black_54"/> 

    </android.support.design.widget.AppBarLayout> 

    <!-- Body views --> 

</android.support.design.widget.CoordinatorLayout> 

Spinn эр вид элемент XML:

<TextView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/text1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@color/primary" 
    android:gravity="center_vertical" 
    android:minHeight="?attr/listPreferredItemHeightSmall" 
    android:paddingLeft="12dp" 
    android:paddingRight="12dp" 
    android:textAppearance="?attr/textAppearanceListItemSmall"/> 

активность Тема:

<style name="Theme.Paper" parent="Theme.AppCompat.Light.NoActionBar"> 
    <item name="colorPrimary">@color/primary</item> 
    <item name="colorPrimaryDark">@color/primary_dark</item> 
    <item name="colorAccent">@color/accent</item> 
    <item name="windowActionBar">false</item> 
    <item name="windowNoTitle">true</item> 
    <item name="windowActionModeOverlay">true</item> 
</style> 

Результат:
ScreenshotScreenshot 2 Как? Я уже ничего не понимаю ... Как это исправить?

+0

Почему бы вам просто не добавить его вместо xml? ToolBar похож на любой другой макет; просто добавьте его внутри панели инструментов, а затем притяните силу для начала или в центр. – Eenvincible

+0

Это не работает, когда я добавляю его в xml. Он показывает только правый треугольник (без текста) –

+0

@Eenvincible, Посмотрите на него, пожалуйста. Я обновил свою тему. –

ответ

2

Зафиксируем этот раз и навсегда Сейчас:

Попробуйте это:

Первый - внутри strings.xml

<string-array name="months"> 
    <item>January</item> 
    <item>February</item> 
    <item>March</item> 
    <item>April</item> 
    <item>May</item> 
    <item>June</item> 
    <item>July</item> 
    <item>August</item> 
</string-array> 

Вы можете просто заменить с реальными значениями;

Во-вторых - в основной макет

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".MainActivity"> 

    <android.support.v7.widget.Toolbar 
    android:id="@+id/toolbar" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="?attr/colorPrimary" 
    android:minHeight="?attr/actionBarSize" /> 

Дело в том, чтобы иметь панель инструментов внутри макета, как вы, вероятно, сделано выше.

Три - изготовление на заказ вертушка макет

Создать настраиваемое представление для вашей блесны!

<?xml version="1.0" encoding="utf-8"?> 
<TextView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/text1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@color/colorPrimary" 
    android:gravity="center_vertical" 
    android:minHeight="?android:attr/listPreferredItemHeightSmall" 
    android:paddingLeft="12dp" 
    android:paddingRight="12dp" 
    android:textAppearance="?android:attr/textAppearanceListItemSmall" /> 

Четыре - MainActivity.java Здесь мы собираемся завершить код.

public class MainActivity extends AppCompatActivity { 

    private Toolbar toolbar = null; 
    private String[] month = null; 

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

    month = getResources().getStringArray(R.array.months); 

    toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    SpinnerAdapter spinnerAdapter = ArrayAdapter.createFromResource(getApplicationContext(), R.array.months, R.layout 
      .spinner_drop_down_item); 
    Spinner navigationSpinner = new Spinner(getSupportActionBar().getThemedContext()); 
    navigationSpinner.setAdapter(spinnerAdapter); 
    toolbar.addView(navigationSpinner, 0); 

     navigationSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
      Toast.makeText(MainActivity.this, 
        "you selected: " + month[position], 
        Toast.LENGTH_SHORT).show(); 
     } 

     @Override 
     public void onNothingSelected(AdapterView<?> parent) { 

     } 
    }); 

    } 
} 

Наконец, для тематизации, вы должны иметь следующее в ваших стилей.XML

<resources> 

<!-- Base application theme. --> 
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> 
    <!-- Customize your theme here. --> 
    <item name="colorPrimary">@color/colorPrimary</item> 
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item> 
    <item name="colorAccent">@color/colorAccent</item> 
    <item name="windowActionModeOverlay">true</item> 
    <item name="windowActionBar">false</item> 
    <item name="android:windowNoTitle">true</item> 
</style> 

Вот это repository я создал для приведенного выше кода.

Надеюсь, это поможет вам; Я попробовал, и все получилось просто отлично;

+0

Спасибо! Я попробую это позже. –

+0

Он не показывает все то же самое! К сожалению, я не могу исключить «AppBarLayout». –

+0

I f @ cked this 'Spinner'. Даже в методе 'onCreate' он будет работать только в том случае, если я уже установил адаптер с контентом или вызвал' notifyDataSetChanged() ' –

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