Commit 305aa196 authored by iman Fauzi's avatar iman Fauzi

fix broken

parent ea490968
......@@ -13,12 +13,9 @@ import android.os.PersistableBundle;
import android.provider.MediaStore;
import android.provider.Settings;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.ImageView;
import android.widget.Toast;
import androidx.annotation.NonNull;
......@@ -36,7 +33,6 @@ import com.yono.messeripos.models.ProductModels;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
public class FormProductActivity extends AppCompatActivity {
......@@ -46,12 +42,6 @@ public class FormProductActivity extends AppCompatActivity {
private static final int REQUEST_IMAGE_CAPTURE = 1;
private static final int REQUEST_PERMISSIONS = 448;
private boolean isUpdate = false;
private Spinner splistCategory;
String kondisi_spin;
private String[] default_category = {
"--pilih category--",
};
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
......@@ -76,30 +66,13 @@ public class FormProductActivity extends AppCompatActivity {
binding.cvProduct.setOnClickListener(view -> openFile());
binding.btnAdd.setOnClickListener(view -> saveProduct());
//spinner
final ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, default_category);
splistCategory = findViewById(R.id.listCategory);
splistCategory.setAdapter(adapter);
splistCategory.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
kondisi_spin = splistCategory.getSelectedItem().toString();
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
});
}
private void saveProduct(){
productModels.setProductName(binding.etName.getText().toString());
productModels.setPriceProduct(Integer.parseInt(binding.etPrice.getText().toString()));
productModels.setStockProduct(Integer.parseInt(binding.etStock.getText().toString()));
// productModels.setPriceProduct(Integer.parseInt(binding.etPrice.getText().toString()));
// productModels.setStockProduct(Integer.parseInt(binding.etStock.getText().toString()));
Toast.makeText(this, productModels.getImageProduct()+" "+productModels.getProductName(), Toast.LENGTH_LONG).show();
}
......@@ -179,5 +152,4 @@ public class FormProductActivity extends AppCompatActivity {
cursor.close();
return result;
}
}
......@@ -49,7 +49,7 @@ public class PaymentActivity extends AppCompatActivity {
LinearLayoutManager llm = new LinearLayoutManager(this, RecyclerView.VERTICAL, false);
rvPayment.setLayoutManager(llm);
paymentResponses.add(new PaymentResponse("https://i.ibb.co/RjJQT9K/BNI-logo.png", "cash"));
paymentResponses.add(new PaymentResponse("https://i.ibb.co/5c40mWX/cash-logo.png", "cash"));
paymentResponses.add(new PaymentResponse("https://i.ibb.co/XCsdmmT/Bank-Mandiri-logo.png", "mandiri"));
paymentResponses.add(new PaymentResponse("https://i.ibb.co/2n65nCT/bca-bank-central-asia.png", "bca"));
paymentResponses.add(new PaymentResponse("https://i.ibb.co/RjJQT9K/BNI-logo.png", "bni"));
......
......@@ -73,52 +73,13 @@
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/tfPrice"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:hint="@string/price"
android:textColor="#fff"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
app:layout_constraintTop_toBottomOf="@id/tfName">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/etPrice"
android:text="@{productForm.priceProduct+``}"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/tfStock"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:hint="@string/stock"
android:textColor="#fff"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
app:layout_constraintTop_toBottomOf="@id/tfPrice">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/etStock"
android:text="@{productForm.stockProduct+``}"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="#fff" />
</com.google.android.material.textfield.TextInputLayout>
<Spinner
android:layout_width="match_parent"
android:id="@+id/planets_spinner"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/listCategory"
android:padding="25dp"
android:layout_margin="10dp"
android:textAlignment="textStart"
android:spinnerMode="dropdown"
app:layout_constraintTop_toBottomOf="@id/tfStock"/>
app:layout_constraintTop_toBottomOf="@id/tfName"
app:layout_constraintStart_toStartOf="parent"/>
<com.google.android.material.button.MaterialButton
android:id="@+id/btnAdd"
......@@ -129,7 +90,6 @@
android:text="@string/add"
android:padding="16dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@+id/listCategory"
app:layout_constraintVertical_bias="1.0"
tools:ignore="MissingConstraints"
tools:layout_editor_absoluteX="16dp" />
......
......@@ -24,4 +24,16 @@
<string name="add">Add</string>
<string name="hint_billing">Billing</string>
<string-array name="planets_array">
<item>Mercury</item>
<item>Venus</item>
<item>Earth</item>
<item>Mars</item>
<item>Jupiter</item>
<item>Saturn</item>
<item>Uranus</item>
<item>Neptune</item>
</string-array>
</resources>
\ No newline at end of file
apply plugin: 'com.android.library'
android {
compileSdkVersion 28
buildToolsVersion '28.0.3'
resourcePrefix 'ms__'
defaultConfig {
minSdkVersion 14
targetSdkVersion 28
}
}
dependencies {
implementation 'androidx.annotation:annotation:1.0.0'
testImplementation 'junit:junit:4.12'
}
VERSION_NAME=1.3.1
VERSION_CODE=131
GROUP=com.jaredrummler
POM_NAME=Material Spinner
POM_ARTIFACT_ID=material-spinner
POM_PACKAGING=aar
POM_DESCRIPTION=A spinner view for Android
POM_URL=https://github.com/jaredrummler/Material-Spinner
POM_SCM_URL=https://github.com/jaredrummler/MaterialSpinner
POM_SCM_CONNECTION=scm:git@github.com:jaredrummler/MaterialSpinner.git
POM_SCM_DEV_CONNECTION=scm:git@github.com:jaredrummler/MaterialSpinner.git
POM_LICENCE_NAME=The Apache Software License, Version 2.0
POM_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt
POM_LICENCE_DIST=repo
POM_DEVELOPER_ID=jaredrummler
POM_DEVELOPER_NAME=Jared Rummler
SNAPSHOT_REPOSITORY_URL=https://oss.sonatype.org/content/repositories/snapshots
RELEASE_REPOSITORY_URL=https://oss.sonatype.org/service/local/staging/deploy/maven2
\ No newline at end of file
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in C:\android-sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
<manifest package="com.jaredrummler.materialspinner"/>
\ No newline at end of file
/*
* Copyright (C) 2016 Jared Rummler
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package com.jaredrummler.materialspinner;
import android.animation.ObjectAnimator;
import android.app.Activity;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.StateListDrawable;
import android.os.Build;
import android.os.Bundle;
import android.os.Parcelable;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.TextView;
import androidx.annotation.ColorInt;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;
/**
* A spinner that shows a {@link PopupWindow} under the view when clicked.
*/
public class MaterialSpinner extends TextView {
private OnNothingSelectedListener onNothingSelectedListener;
private OnItemSelectedListener onItemSelectedListener;
private MaterialSpinnerBaseAdapter adapter;
private PopupWindow popupWindow;
private ListView listView;
private Drawable arrowDrawable;
private boolean hideArrow;
private boolean nothingSelected;
private int popupWindowMaxHeight;
private int popupWindowHeight;
private int selectedIndex;
private int backgroundColor;
private int backgroundSelector;
private int arrowColor;
private int arrowColorDisabled;
private int textColor;
private int hintColor;
private int popupPaddingTop;
private int popupPaddingLeft;
private int popupPaddingBottom;
private int popupPaddingRight;
private String hintText;
public MaterialSpinner(Context context) {
super(context);
init(context, null);
}
public MaterialSpinner(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
public MaterialSpinner(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs);
}
private void init(Context context, AttributeSet attrs) {
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MaterialSpinner);
int defaultColor = getTextColors().getDefaultColor();
boolean rtl = Utils.isRtl(context);
int paddingLeft, paddingTop, paddingRight, paddingBottom;
int defaultPaddingLeft, defaultPaddingTop, defaultPaddingRight, defaultPaddingBottom;
int defaultPopupPaddingLeft, defaultPopupPaddingTop, defaultPopupPaddingRight, defaultPopupPaddingBottom;
Resources resources = getResources();
defaultPaddingLeft = defaultPaddingRight =
defaultPaddingBottom = defaultPaddingTop = resources.getDimensionPixelSize(R.dimen.ms__padding_top);
if (rtl) {
defaultPaddingRight = resources.getDimensionPixelSize(R.dimen.ms__padding_left);
} else {
defaultPaddingLeft = resources.getDimensionPixelSize(R.dimen.ms__padding_left);
}
defaultPopupPaddingLeft =
defaultPopupPaddingRight = resources.getDimensionPixelSize(R.dimen.ms__popup_padding_left);
defaultPopupPaddingTop = defaultPopupPaddingBottom = resources.getDimensionPixelSize(R.dimen.ms__popup_padding_top);
try {
backgroundColor = ta.getColor(R.styleable.MaterialSpinner_ms_background_color, Color.WHITE);
backgroundSelector = ta.getResourceId(R.styleable.MaterialSpinner_ms_background_selector, 0);
textColor = ta.getColor(R.styleable.MaterialSpinner_ms_text_color, defaultColor);
hintColor = ta.getColor(R.styleable.MaterialSpinner_ms_hint_color, defaultColor);
arrowColor = ta.getColor(R.styleable.MaterialSpinner_ms_arrow_tint, textColor);
hideArrow = ta.getBoolean(R.styleable.MaterialSpinner_ms_hide_arrow, false);
hintText = ta.getString(R.styleable.MaterialSpinner_ms_hint) == null ? ""
: ta.getString(R.styleable.MaterialSpinner_ms_hint);
popupWindowMaxHeight = ta.getDimensionPixelSize(R.styleable.MaterialSpinner_ms_dropdown_max_height, 0);
popupWindowHeight = ta.getLayoutDimension(R.styleable.MaterialSpinner_ms_dropdown_height,
WindowManager.LayoutParams.WRAP_CONTENT);
paddingTop = ta.getDimensionPixelSize(R.styleable.MaterialSpinner_ms_padding_top, defaultPaddingTop);
paddingLeft = ta.getDimensionPixelSize(R.styleable.MaterialSpinner_ms_padding_left, defaultPaddingLeft);
paddingBottom = ta.getDimensionPixelSize(R.styleable.MaterialSpinner_ms_padding_bottom, defaultPaddingBottom);
paddingRight = ta.getDimensionPixelSize(R.styleable.MaterialSpinner_ms_padding_right, defaultPaddingRight);
popupPaddingTop =
ta.getDimensionPixelSize(R.styleable.MaterialSpinner_ms_popup_padding_top, defaultPopupPaddingTop);
popupPaddingLeft =
ta.getDimensionPixelSize(R.styleable.MaterialSpinner_ms_popup_padding_left, defaultPopupPaddingLeft);
popupPaddingBottom =
ta.getDimensionPixelSize(R.styleable.MaterialSpinner_ms_popup_padding_bottom, defaultPopupPaddingBottom);
popupPaddingRight =
ta.getDimensionPixelSize(R.styleable.MaterialSpinner_ms_popup_padding_right, defaultPopupPaddingRight);
arrowColorDisabled = Utils.lighter(arrowColor, 0.8f);
} finally {
ta.recycle();
}
nothingSelected = true;
setGravity(Gravity.CENTER_VERTICAL | Gravity.START);
setClickable(true);
setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom);
setBackgroundResource(R.drawable.ms__selector);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && rtl) {
setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
setTextDirection(View.TEXT_DIRECTION_RTL);
}
if (!hideArrow) {
arrowDrawable = Utils.getDrawable(context, R.drawable.ms__arrow).mutate();
arrowDrawable.setColorFilter(arrowColor, PorterDuff.Mode.SRC_IN);
Drawable[] drawables = getCompoundDrawables();
if (rtl) {
drawables[0] = arrowDrawable;
} else {
drawables[2] = arrowDrawable;
}
setCompoundDrawablesWithIntrinsicBounds(drawables[0], drawables[1], drawables[2], drawables[3]);
}
listView = new ListView(context);
listView.setId(getId());
listView.setDivider(null);
listView.setItemsCanFocus(true);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (position >= selectedIndex
&& position < adapter.getCount()
&& adapter.getItems().size() != 1
&& TextUtils.isEmpty(hintText)) {
position++;
}
selectedIndex = position;
nothingSelected = false;
Object item = adapter.get(position);
adapter.notifyItemSelected(position);
setTextColor(textColor);
setText(item.toString());
collapse();
if (onItemSelectedListener != null) {
//noinspection unchecked
onItemSelectedListener.onItemSelected(MaterialSpinner.this, position, id, item);
}
}
});
popupWindow = new PopupWindow(context);
popupWindow.setContentView(listView);
popupWindow.setOutsideTouchable(true);
popupWindow.setFocusable(true);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
popupWindow.setElevation(16);
popupWindow.setBackgroundDrawable(Utils.getDrawable(context, R.drawable.ms__drawable));
} else {
popupWindow.setBackgroundDrawable(Utils.getDrawable(context, R.drawable.ms__drop_down_shadow));
}
if (backgroundColor != Color.WHITE) { // default color is white
setBackgroundColor(backgroundColor);
} else if (backgroundSelector != 0) {
setBackgroundResource(backgroundSelector);
}
if (textColor != defaultColor) {
setTextColor(textColor);
}
popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
@Override public void onDismiss() {
if (nothingSelected && onNothingSelectedListener != null) {
onNothingSelectedListener.onNothingSelected(MaterialSpinner.this);
}
if (!hideArrow) {
animateArrow(false);
}
}
});
}
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
popupWindow.setWidth(MeasureSpec.getSize(widthMeasureSpec));
popupWindow.setHeight(calculatePopupWindowHeight());
if (adapter != null) {
CharSequence currentText = getText();
String longestItem = currentText.toString();
for (int i = 0; i < adapter.getCount(); i++) {
String itemText = adapter.getItemText(i);
if (itemText.length() > longestItem.length()) {
longestItem = itemText;
}
}
setText(longestItem);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
setText(currentText);
} else {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
@Override public boolean onTouchEvent(@NonNull MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
if (isEnabled() && isClickable()) {
if (!popupWindow.isShowing()) {
expand();
} else {
collapse();
}
}
}
return super.onTouchEvent(event);
}
@Override public void setBackgroundColor(int color) {
backgroundColor = color;
Drawable background = getBackground();
if (background instanceof StateListDrawable) { // pre-L
try {
Method getStateDrawable = StateListDrawable.class.getDeclaredMethod("getStateDrawable", int.class);
if (!getStateDrawable.isAccessible()) getStateDrawable.setAccessible(true);
int[] colors = { Utils.darker(color, 0.85f), color };
for (int i = 0; i < colors.length; i++) {
ColorDrawable drawable = (ColorDrawable) getStateDrawable.invoke(background, i);
drawable.setColor(colors[i]);
}
} catch (Exception e) {
Log.e("MaterialSpinner", "Error setting background color", e);
}
} else if (background != null) { // 21+ (RippleDrawable)
background.setColorFilter(color, PorterDuff.Mode.SRC_IN);
}
popupWindow.getBackground().setColorFilter(color, PorterDuff.Mode.SRC_IN);
}
@Override public void setTextColor(int color) {
textColor = color;
if (adapter != null) {
adapter.setTextColor(textColor);
adapter.notifyDataSetChanged();
}
super.setTextColor(color);
}
public void setHintColor(int color) {
hintColor = color;
super.setTextColor(color);
}
@Override public Parcelable onSaveInstanceState() {
Bundle bundle = new Bundle();
bundle.putParcelable("state", super.onSaveInstanceState());
bundle.putInt("selected_index", selectedIndex);
bundle.putBoolean("nothing_selected", nothingSelected);
if (popupWindow != null) {
bundle.putBoolean("is_popup_showing", popupWindow.isShowing());
collapse();
} else {
bundle.putBoolean("is_popup_showing", false);
}
return bundle;
}
@Override public void onRestoreInstanceState(Parcelable savedState) {
if (savedState instanceof Bundle) {
Bundle bundle = (Bundle) savedState;
selectedIndex = bundle.getInt("selected_index");
nothingSelected = bundle.getBoolean("nothing_selected");
if (adapter != null) {
if (nothingSelected && !TextUtils.isEmpty(hintText)) {
setHintColor(hintColor);
setText(hintText);
} else {
setTextColor(textColor);
setText(adapter.get(selectedIndex).toString());
}
adapter.notifyItemSelected(selectedIndex);
}
if (bundle.getBoolean("is_popup_showing")) {
if (popupWindow != null) {
// Post the show request into the looper to avoid bad token exception
post(new Runnable() {
@Override public void run() {
expand();
}
});
}
}
savedState = bundle.getParcelable("state");
}
super.onRestoreInstanceState(savedState);
}
@Override public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
if (arrowDrawable != null) {
arrowDrawable.setColorFilter(enabled ? arrowColor : arrowColorDisabled, PorterDuff.Mode.SRC_IN);
}
}
/**
* @return the selected item position
*/
public int getSelectedIndex() {
return selectedIndex;
}
/**
* Set the default spinner item using its index
*
* @param position the item's position
*/
public void setSelectedIndex(int position) {
if (adapter != null) {
if (position >= 0 && position <= adapter.getCount()) {
adapter.notifyItemSelected(position);
selectedIndex = position;
setText(adapter.get(position).toString());
} else {
throw new IllegalArgumentException("Position must be lower than adapter count!");
}
}
}
/**
* Register a callback to be invoked when an item in the dropdown is selected.
*
* @param onItemSelectedListener The callback that will run
*/
public void setOnItemSelectedListener(@Nullable OnItemSelectedListener onItemSelectedListener) {
this.onItemSelectedListener = onItemSelectedListener;
}
/**
* Register a callback to be invoked when the {@link PopupWindow} is shown but the user didn't select an item.
*
* @param onNothingSelectedListener the callback that will run
*/
public void setOnNothingSelectedListener(@Nullable OnNothingSelectedListener onNothingSelectedListener) {
this.onNothingSelectedListener = onNothingSelectedListener;
}
/**
* Set the dropdown items
*
* @param items A list of items
* @param <T> The item type
*/
public <T> void setItems(@NonNull T... items) {
setItems(Arrays.asList(items));
}
/**
* Set the dropdown items
*
* @param items A list of items
* @param <T> The item type
*/
public <T> void setItems(@NonNull List<T> items) {
adapter = new MaterialSpinnerAdapter<>(getContext(), items)
.setPopupPadding(popupPaddingLeft, popupPaddingTop, popupPaddingRight, popupPaddingBottom)
.setBackgroundSelector(backgroundSelector)
.setTextColor(textColor);
setAdapterInternal(adapter);
}
/**
* Set a custom adapter for the dropdown items
*
* @param adapter The list adapter
*/
public void setAdapter(@NonNull ListAdapter adapter) {
this.adapter = new MaterialSpinnerAdapterWrapper(getContext(), adapter)
.setPopupPadding(popupPaddingLeft, popupPaddingTop, popupPaddingRight, popupPaddingBottom)
.setBackgroundSelector(backgroundSelector)
.setTextColor(textColor);
setAdapterInternal(this.adapter);
}
/**
* Set the custom adapter for the dropdown items
*
* @param adapter The adapter
* @param <T> The type
*/
public <T> void setAdapter(MaterialSpinnerAdapter<T> adapter) {
this.adapter = adapter;
this.adapter.setTextColor(textColor);
this.adapter.setBackgroundSelector(backgroundSelector);
this.adapter.setPopupPadding(popupPaddingLeft, popupPaddingTop, popupPaddingRight, popupPaddingBottom);
setAdapterInternal(adapter);
}
private void setAdapterInternal(@NonNull MaterialSpinnerBaseAdapter adapter) {
boolean shouldResetPopupHeight = listView.getAdapter() != null;
adapter.setHintEnabled(!TextUtils.isEmpty(hintText));
listView.setAdapter(adapter);
if (selectedIndex >= adapter.getCount()) {
selectedIndex = 0;
}
if (adapter.getItems().size() > 0) {
if (nothingSelected && !TextUtils.isEmpty(hintText)) {
setText(hintText);
setHintColor(hintColor);
} else {
setTextColor(textColor);
setText(adapter.get(selectedIndex).toString());
}
} else {
setText("");
}
if (shouldResetPopupHeight) {
popupWindow.setHeight(calculatePopupWindowHeight());
}
}
/**
* Get the list of items in the adapter
*
* @param <T> The item type
* @return A list of items or {@code null} if no items are set.
*/
public <T> List<T> getItems() {
if (adapter == null) {
return null;
}
//noinspection unchecked
return adapter.getItems();
}
/**
* Show the dropdown menu
*/
public void expand() {
if (canShowPopup()) {
if (!hideArrow) {
animateArrow(true);
}
nothingSelected = true;
popupWindow.showAsDropDown(this);
}
}
/**
* Closes the dropdown menu
*/
public void collapse() {
if (!hideArrow) {
animateArrow(false);
}
popupWindow.dismiss();
}
/**
* Set the tint color for the dropdown arrow
*
* @param color the color value
*/
public void setArrowColor(@ColorInt int color) {
arrowColor = color;
arrowColorDisabled = Utils.lighter(arrowColor, 0.8f);
if (arrowDrawable != null) {
arrowDrawable.setColorFilter(arrowColor, PorterDuff.Mode.SRC_IN);
}
}
private boolean canShowPopup() {
Activity activity = getActivity();
if (activity == null || activity.isFinishing()) {
return false;
}
boolean isLaidOut;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
isLaidOut = isLaidOut();
} else {
isLaidOut = getWidth() > 0 && getHeight() > 0;
}
return isLaidOut;
}
private Activity getActivity() {
Context context = getContext();
while (context instanceof ContextWrapper) {
if (context instanceof Activity) {
return (Activity) context;
}
context = ((ContextWrapper) context).getBaseContext();
}
return null;
}
private void animateArrow(boolean shouldRotateUp) {
int start = shouldRotateUp ? 0 : 10000;
int end = shouldRotateUp ? 10000 : 0;
ObjectAnimator animator = ObjectAnimator.ofInt(arrowDrawable, "level", start, end);
animator.start();
}
/**
* Set the maximum height of the dropdown menu.
*
* @param height the height in pixels
*/
public void setDropdownMaxHeight(int height) {
popupWindowMaxHeight = height;
popupWindow.setHeight(calculatePopupWindowHeight());
}
/**
* Set the height of the dropdown menu
*
* @param height the height in pixels
*/
public void setDropdownHeight(int height) {
popupWindowHeight = height;
popupWindow.setHeight(calculatePopupWindowHeight());
}
private int calculatePopupWindowHeight() {
if (adapter == null) {
return WindowManager.LayoutParams.WRAP_CONTENT;
}
float itemHeight = getResources().getDimension(R.dimen.ms__item_height);
float listViewHeight = adapter.getCount() * itemHeight;
if (popupWindowMaxHeight > 0 && listViewHeight > popupWindowMaxHeight) {
return popupWindowMaxHeight;
} else if (popupWindowHeight != WindowManager.LayoutParams.MATCH_PARENT
&& popupWindowHeight != WindowManager.LayoutParams.WRAP_CONTENT
&& popupWindowHeight <= listViewHeight) {
return popupWindowHeight;
} else if (listViewHeight == 0 && adapter.getItems().size() == 1) {
return (int) itemHeight;
}
return WindowManager.LayoutParams.WRAP_CONTENT;
}
/**
* Get the {@link PopupWindow}.
*
* @return The {@link PopupWindow} that is displayed when the view has been clicked.
*/
public PopupWindow getPopupWindow() {
return popupWindow;
}
/**
* Get the {@link ListView} that is used in the dropdown menu
*
* @return the ListView shown in the PopupWindow.
*/
public ListView getListView() {
return listView;
}
/**
* Interface definition for a callback to be invoked when an item in this view has been selected.
*
* @param <T> Adapter item type
*/
public interface OnItemSelectedListener<T> {
/**
* <p>Callback method to be invoked when an item in this view has been selected. This callback is invoked only when
* the newly selected position is different from the previously selected position or if there was no selected
* item.</p>
*
* @param view The {@link MaterialSpinner} view
* @param position The position of the view in the adapter
* @param id The row id of the item that is selected
* @param item The selected item
*/
void onItemSelected(MaterialSpinner view, int position, long id, T item);
}
/**
* Interface definition for a callback to be invoked when the dropdown is dismissed and no item was selected.
*/
public interface OnNothingSelectedListener {
/**
* Callback method to be invoked when the {@link PopupWindow} is dismissed and no item was selected.
*
* @param spinner the {@link MaterialSpinner}
*/
void onNothingSelected(MaterialSpinner spinner);
}
}
\ No newline at end of file
/*
* Copyright (C) 2016 Jared Rummler
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package com.jaredrummler.materialspinner;
import android.content.Context;
import java.util.List;
public class MaterialSpinnerAdapter<T> extends MaterialSpinnerBaseAdapter {
private final List<T> items;
public MaterialSpinnerAdapter(Context context, List<T> items) {
super(context);
this.items = items;
}
@Override public int getCount() {
int size = items.size();
if (size == 1 || isHintEnabled()) return size;
return size - 1;
}
@Override public T getItem(int position) {
if (isHintEnabled()) {
return items.get(position);
} else if (position >= getSelectedIndex() && items.size() != 1) {
return items.get(position + 1);
} else {
return items.get(position);
}
}
@Override public T get(int position) {
return items.get(position);
}
@Override public List<T> getItems() {
return items;
}
}
\ No newline at end of file
/*
* Copyright (C) 2016 Jared Rummler
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package com.jaredrummler.materialspinner;
import android.content.Context;
import android.widget.ListAdapter;
import java.util.ArrayList;
import java.util.List;
final class MaterialSpinnerAdapterWrapper extends MaterialSpinnerBaseAdapter {
private final ListAdapter listAdapter;
public MaterialSpinnerAdapterWrapper(Context context, ListAdapter toWrap) {
super(context);
listAdapter = toWrap;
}
@Override public int getCount() {
int size = listAdapter.getCount();
if (size == 1 || isHintEnabled()) return size;
return size - 1;
}
@Override public Object getItem(int position) {
if (isHintEnabled()) {
return listAdapter.getItem(position);
} else if (position >= getSelectedIndex() && listAdapter.getCount() != 1) {
return listAdapter.getItem(position + 1);
} else {
return listAdapter.getItem(position);
}
}
@Override public Object get(int position) {
return listAdapter.getItem(position);
}
@Override public List<Object> getItems() {
List<Object> items = new ArrayList<>();
for (int i = 0; i < listAdapter.getCount(); i++) {
items.add(listAdapter.getItem(i));
}
return items;
}
}
\ No newline at end of file
/*
* Copyright (C) 2016 Jared Rummler
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package com.jaredrummler.materialspinner;
import android.content.Context;
import android.content.res.Configuration;
import android.os.Build;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import androidx.annotation.ColorInt;
import androidx.annotation.DrawableRes;
import java.util.List;
public abstract class MaterialSpinnerBaseAdapter<T> extends BaseAdapter {
private final Context context;
private int selectedIndex;
private int textColor;
private int backgroundSelector;
private int popupPaddingTop;
private int popupPaddingLeft;
private int popupPaddingBottom;
private int popupPaddingRight;
private boolean isHintEnabled;
public MaterialSpinnerBaseAdapter(Context context) {
this.context = context;
}
@Override public View getView(int position, View convertView, ViewGroup parent) {
final TextView textView;
if (convertView == null) {
LayoutInflater inflater = LayoutInflater.from(context);
convertView = inflater.inflate(R.layout.ms__list_item, parent, false);
textView = (TextView) convertView.findViewById(R.id.tv_tinted_spinner);
textView.setTextColor(textColor);
textView.setPadding(popupPaddingLeft, popupPaddingTop, popupPaddingRight, popupPaddingBottom);
//
// int left, right, bottom, top;
// if (popupPaddingTop != -1) {
// left = textView.getPaddingLeft();
// right = textView.getPaddingRight();
// bottom = textView.getPaddingBottom();
//
// textView.setPadding(left, popupPaddingTop, right, bottom);
// }
//
// if (popupPaddingLeft != -1) {
// top = textView.getPaddingTop();
// right = textView.getPaddingRight();
// bottom = textView.getPaddingBottom();
//
// textView.setPadding(popupPaddingLeft, top, right, bottom);
// }
//
// if (popupPaddingBottom != -1) {
// left = textView.getPaddingLeft();
// top = textView.getPaddingTop();
// right = textView.getPaddingRight();
//
// textView.setPadding(left, top, right, popupPaddingBottom);
// }
//
// if (popupPaddingRight != -1) {
// left = textView.getPaddingLeft();
// top = textView.getPaddingTop();
// bottom = textView.getPaddingBottom();
//
// textView.setPadding(left, top, popupPaddingRight, bottom);
// }
if (backgroundSelector != 0) {
textView.setBackgroundResource(backgroundSelector);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
Configuration config = context.getResources().getConfiguration();
if (config.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL) {
textView.setTextDirection(View.TEXT_DIRECTION_RTL);
}
}
convertView.setTag(new ViewHolder(textView));
} else {
textView = ((ViewHolder) convertView.getTag()).textView;
}
textView.setText(getItemText(position));
return convertView;
}
public String getItemText(int position) {
return getItem(position).toString();
}
public int getSelectedIndex() {
return selectedIndex;
}
public void notifyItemSelected(int index) {
selectedIndex = index;
}
@Override public long getItemId(int position) {
return position;
}
@Override public abstract T getItem(int position);
@Override public abstract int getCount();
public abstract T get(int position);
public abstract List<T> getItems();
public void setHintEnabled(boolean isHintEnabled) {
this.isHintEnabled = isHintEnabled;
}
public boolean isHintEnabled() {
return this.isHintEnabled;
}
public MaterialSpinnerBaseAdapter<T> setTextColor(@ColorInt int textColor) {
this.textColor = textColor;
return this;
}
public MaterialSpinnerBaseAdapter<T> setBackgroundSelector(@DrawableRes int backgroundSelector) {
this.backgroundSelector = backgroundSelector;
return this;
}
public MaterialSpinnerBaseAdapter<T> setPopupPadding(int left, int top, int right, int bottom) {
this.popupPaddingLeft = left;
this.popupPaddingTop = top;
this.popupPaddingRight = right;
this.popupPaddingBottom = bottom;
return this;
}
private static class ViewHolder {
private TextView textView;
private ViewHolder(TextView textView) {
this.textView = textView;
}
}
}
\ No newline at end of file
/*
* Copyright (C) 2016 Jared Rummler
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package com.jaredrummler.materialspinner;
import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.view.View;
final class Utils {
/**
* Darkens a color by a given factor.
*
* @param color the color to darken
* @param factor The factor to darken the color.
* @return darker version of specified color.
*/
static int darker(int color, float factor) {
return Color.argb(Color.alpha(color), Math.max((int) (Color.red(color) * factor), 0),
Math.max((int) (Color.green(color) * factor), 0), Math.max((int) (Color.blue(color) * factor), 0));
}
/**
* Lightens a color by a given factor.
*
* @param color The color to lighten
* @param factor The factor to lighten the color. 0 will make the color unchanged. 1 will make the
* color white.
* @return lighter version of the specified color.
*/
static int lighter(int color, float factor) {
int red = (int) ((Color.red(color) * (1 - factor) / 255 + factor) * 255);
int green = (int) ((Color.green(color) * (1 - factor) / 255 + factor) * 255);
int blue = (int) ((Color.blue(color) * (1 - factor) / 255 + factor) * 255);
return Color.argb(Color.alpha(color), red, green, blue);
}
/**
* Check if layout direction is RTL
*
* @param context the current context
* @return {@code true} if the layout direction is right-to-left
*/
static boolean isRtl(Context context) {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1
&& context.getResources().getConfiguration().getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
}
/**
* Return a drawable object associated with a particular resource ID.
*
* <p>Starting in {@link android.os.Build.VERSION_CODES#LOLLIPOP}, the returned drawable will be styled for the
* specified Context's theme.</p>
*
* @param id The desired resource identifier, as generated by the aapt tool.
* This integer encodes the package, type, and resource entry.
* The value 0 is an invalid identifier.
* @return Drawable An object that can be used to draw this resource.
*/
static Drawable getDrawable(Context context, int id) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
return context.getDrawable(id);
}
return context.getResources().getDrawable(id);
}
}
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright (C) 2016 Jared Rummler
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
~
-->
<ripple
xmlns:android="http://schemas.android.com/apk/res/android"
android:color="?android:attr/colorControlHighlight">
<item
android:id="@android:id/mask"
android:drawable="@android:color/white"/>
<item android:bottom="1dp">
<shape>
<solid android:color="@android:color/white"/>
</shape>
</item>
</ripple>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright (C) 2016 Jared Rummler
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
~
-->
<rotate
xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/ms__menu_down"
android:fromDegrees="0"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="180"/>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ Copyright (C) 2016 Jared Rummler
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
~
-->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:top="3dp">
<shape android:shape="rectangle">
<solid android:color="@android:color/white"/>
<corners
android:bottomLeftRadius="1dp"
android:bottomRightRadius="1dp"
android:topLeftRadius="1dp"
android:topRightRadius="1dp"/>
</shape>
</item>
</layer-list>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright (C) 2016 Jared Rummler
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
~
-->
<vector
xmlns:android="http://schemas.android.com/apk/res/android"
android:height="24dp"
android:viewportHeight="24"
android:viewportWidth="24"
android:width="24dp">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M7,10L12,15L17,10H7Z"/>
</vector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright (C) 2016 Jared Rummler
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
~
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/darker_gray" android:state_pressed="true"/>
<item android:drawable="@android:color/white" android:state_pressed="false"/>
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright (C) 2016 Jared Rummler
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
~
-->
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/tv_tinted_spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="start|center_vertical"
android:ellipsize="marquee"
android:gravity="center_vertical"
android:minHeight="@dimen/ms__item_height"
android:paddingBottom="@dimen/ms__popup_padding_top"
android:paddingLeft="@dimen/ms__popup_padding_left"
android:paddingRight="@dimen/ms__popup_padding_left"
android:paddingStart="@dimen/ms__popup_padding_left"
android:paddingTop="@dimen/ms__popup_padding_top"
android:singleLine="true"
/>
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright (C) 2016 Jared Rummler
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
~
-->
<resources xmlns:tools="http://schemas.android.com/tools">
<declare-styleable name="MaterialSpinner" tools:ignore="ResourceName">
<attr format="color" name="ms_arrow_tint"/>
<attr format="boolean" name="ms_hide_arrow"/>
<attr format="color" name="ms_background_color"/>
<attr format="color" name="ms_text_color"/>
<attr format="dimension" name="ms_dropdown_max_height"/>
<attr format="dimension" name="ms_dropdown_height">
<enum name="fill_parent" value="-1"/>
<enum name="match_parent" value="-1"/>
<enum name="wrap_content" value="-2"/>
</attr>
<attr format="integer" name="ms_background_selector"/>
<attr format="dimension" name="ms_padding_top"/>
<attr format="dimension" name="ms_padding_left"/>
<attr format="dimension" name="ms_padding_bottom"/>
<attr format="dimension" name="ms_padding_right"/>
<attr format="dimension" name="ms_popup_padding_top"/>
<attr format="dimension" name="ms_popup_padding_left"/>
<attr format="dimension" name="ms_popup_padding_bottom"/>
<attr format="dimension" name="ms_popup_padding_right"/>
<attr format="string" name="ms_hint"/>
<attr format="color" name="ms_hint_color"/>
</declare-styleable>
</resources>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright (C) 2016 Jared Rummler
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
~
-->
<resources>
<dimen name="ms__padding_left">24dp</dimen>
<dimen name="ms__padding_top">12dp</dimen>
<dimen name="ms__item_height">48dp</dimen>
<dimen name="ms__popup_padding_left">24dp</dimen>
<dimen name="ms__popup_padding_top">12dp</dimen>
</resources>
\ No newline at end of file
apply plugin: 'com.android.application'
android {
compileSdkVersion 28
buildToolsVersion '28.0.3'
defaultConfig {
applicationId "com.jaredrummler.materialspinner.example"
minSdkVersion 14
targetSdkVersion 28
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
lintOptions {
abortOnError false
}
}
dependencies {
implementation 'com.google.android.material:material:1.0.0'
implementation project(':library')
}
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in C:\android-sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright (C) 2016 Jared Rummler
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
~
-->
<manifest package="com.jaredrummler.materialspinner.example"
xmlns:android="http://schemas.android.com/apk/res/android">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".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>
</manifest>
/*
* Copyright (C) 2016 Jared Rummler
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package com.jaredrummler.materialspinner.example;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;
import com.jaredrummler.materialspinner.MaterialSpinner;
public class MainActivity extends AppCompatActivity {
private static final String[] ANDROID_VERSIONS = {
"Cupcake",
"Donut",
"Eclair",
"Froyo",
"Gingerbread",
"Honeycomb",
"Ice Cream Sandwich",
"Jelly Bean",
"KitKat",
"Lollipop",
"Marshmallow",
"Nougat",
"Oreo"
};
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View view) {
try {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://github.com/jaredrummler/MaterialSpinner")));
} catch (ActivityNotFoundException ignored) {
}
}
});
MaterialSpinner spinner = (MaterialSpinner) findViewById(R.id.spinner);
spinner.setItems(ANDROID_VERSIONS);
spinner.setOnItemSelectedListener(new MaterialSpinner.OnItemSelectedListener<String>() {
@Override public void onItemSelected(MaterialSpinner view, int position, long id, String item) {
Snackbar.make(view, "Clicked " + item, Snackbar.LENGTH_LONG).show();
}
});
spinner.setOnNothingSelectedListener(new MaterialSpinner.OnNothingSelectedListener() {
@Override public void onNothingSelected(MaterialSpinner spinner) {
Snackbar.make(spinner, "Nothing selected", Snackbar.LENGTH_LONG).show();
}
});
}
}
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright (C) 2016 Jared Rummler
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
~
-->
<vector
xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportHeight="24"
android:viewportWidth="24">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M12,2A10,10 0 0,0 2,12C2,16.42 4.87,20.17 8.84,21.5C9.34,21.58 9.5,21.27 9.5,21C9.5,20.77 9.5,20.14 9.5,19.31C6.73,19.91 6.14,17.97 6.14,17.97C5.68,16.81 5.03,16.5 5.03,16.5C4.12,15.88 5.1,15.9 5.1,15.9C6.1,15.97 6.63,16.93 6.63,16.93C7.5,18.45 8.97,18 9.54,17.76C9.63,17.11 9.89,16.67 10.17,16.42C7.95,16.17 5.62,15.31 5.62,11.5C5.62,10.39 6,9.5 6.65,8.79C6.55,8.54 6.2,7.5 6.75,6.15C6.75,6.15 7.59,5.88 9.5,7.17C10.29,6.95 11.15,6.84 12,6.84C12.85,6.84 13.71,6.95 14.5,7.17C16.41,5.88 17.25,6.15 17.25,6.15C17.8,7.5 17.45,8.54 17.35,8.79C18,9.5 18.38,10.39 18.38,11.5C18.38,15.32 16.04,16.16 13.81,16.41C14.17,16.72 14.5,17.33 14.5,18.26C14.5,19.6 14.5,20.68 14.5,21C14.5,21.27 14.66,21.59 15.17,21.5C19.14,20.16 22,16.42 22,12A10,10 0 0,0 12,2Z"/>
</vector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright (C) 2016 Jared Rummler
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
~
-->
<androidx.coordinatorlayout.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"
android:fitsSystemWindows="true"
tools:context=".MainActivity">
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay"/>
</com.google.android.material.appbar.AppBarLayout>
<include layout="@layout/content_main"/>
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="@dimen/fab_margin"
android:src="@drawable/ic_github_white_24dp"/>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright (C) 2016 Jared Rummler
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
~
-->
<RelativeLayout
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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context=".MainActivity"
tools:showIn="@layout/activity_main">
<com.jaredrummler.materialspinner.MaterialSpinner
android:id="@+id/spinner"
app:ms_dropdown_max_height="350dp"
app:ms_dropdown_height="wrap_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</RelativeLayout>
<!--
~ Copyright (C) 2016 Jared Rummler
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
~
-->
<resources>>
<style name="AppTheme.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:statusBarColor">@android:color/transparent</item>
</style>
</resources>
<!--
~ Copyright (C) 2016 Jared Rummler
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
~
-->
<resources>
<!-- Example customization of dimensions originally defined in res/values/dimens.xml
(such as screen margins) for screens with more than 820dp of available width. This
would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). -->
<dimen name="activity_horizontal_margin">64dp</dimen>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright (C) 2016 Jared Rummler
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
~
-->
<resources>
<color name="colorPrimary">#3F51B5</color>
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#FF4081</color>
</resources>
<!--
~ Copyright (C) 2016 Jared Rummler
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
~
-->
<resources>
<!-- Default screen margins, per the Android Design guidelines. -->
<dimen name="activity_horizontal_margin">16dp</dimen>
<dimen name="activity_vertical_margin">16dp</dimen>
<dimen name="fab_margin">16dp</dimen>
</resources>
<!--
~ Copyright (C) 2016 Jared Rummler
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
~
-->
<resources>
<string name="app_name">Material Spinner</string>
</resources>
<!--
~ Copyright (C) 2016 Jared Rummler
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
~
-->
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.MaterialComponents.Dark.ActionBar"/>
<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.MaterialComponents.Light"/>
</resources>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment