#android #drop-down-menu #spinner
#Android #выпадающее меню #счетчик
Вопрос:
Я хотел бы создать выпадающий счетчик на Android > = 1.6, который выглядит как выпадающий счетчик на Android 3.0, где список параметров привязан к селектору (выбранному значению).
Спасибо
Ответ №1:
Я сделал это с помощью TextView, методом onClick открыл всплывающее окно, содержащее ListView, в ListView onClick установил TextView и отключил всплывающее окно.
public class SpinnerDropBox extends TextView{
int mHeight;
ListView mListView;
List<String> mListChoice;
Context mContext;
int mWidth = 0;
PopupWindow popSpin;
TextView pThis;
int mLastPos;
public SpinnerDropBox(Context context, List<String> listChoice) {
super(context);
mContext = context;
mListChoice = listChoice;
mWidth = getMaxWidthOfList();
this.setWidth(mWidth);
this.setText(mListChoice.get(0));
pThis = this;
this.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
showDropBox();
}
});
}
private int getMaxWidthOfList(){
int width = 0;
Paint paint = new Paint();
for(String s : mListChoice){
if((int)this.getPaint().measureText(s) > width){
width = (int)paint.measureText(s);
}
}
width *=3;
int screenWidth = ((WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getWidth();
if(width > screenWidth){
width = screenWidth;
}
return width;
}
public void setChoice(int pos){
this.setText(mListChoice.get(pos));
}
void showDropBox(){
int xPos, yPos, arrowPos;
int[] location = new int[2];
this.getLocationOnScreen(location);
Rect rect = new Rect(location[0], location[1], location[0] this.getWidth(), location[1] this.getHeight());
this.measure(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
int rootHeight = this.getMeasuredHeight();
int rootWidth = 0;
if (rootWidth == 0) {
rootWidth = this.getMeasuredWidth();
}
int screenWidth = ((WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getWidth();
int screenHeight = ((WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getHeight();
if ((rect.left rootWidth) > screenWidth) {
xPos = rect.left - (rootWidth-this.getWidth());
xPos = (xPos < 0) ? 0 : xPos;
arrowPos = rect.centerX()-xPos;
} else {
if (this.getWidth() > rootWidth) {
xPos = rect.centerX() - (rootWidth/2);
} else {
xPos = rect.left;
}
arrowPos = rect.centerX()-xPos;
}
popSpin = new PopupWindow(mContext);
popSpin.setHeight(WindowManager.LayoutParams.WRAP_CONTENT);
popSpin.setWidth(mWidth);
popSpin.setTouchable(true);
popSpin.setFocusable(true);
LinearLayout laySpin = new LinearLayout(mContext);
laySpin.setLayoutParams(new LayoutParams(mWidth, LayoutParams.WRAP_CONTENT));
ListView lv = new ListView(mContext);
lv.setLayoutParams(new LayoutParams(mWidth, LayoutParams.WRAP_CONTENT));
lv.setItemsCanFocus(true);
lv.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
lv.setFocusable(false);
lv.setOnItemClickListener(listListener);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(mContext.getApplicationContext(), R.layout.simple, mListChoice);
lv.setAdapter(adapter);
laySpin.addView(lv);
popSpin.setContentView(laySpin);
if((screenHeight-rect.bottom) > (rootHeight*mListChoice.size())){
yPos = rect.bottom;
}
else{
yPos = rect.top - (rootHeight*mListChoice.size() mListChoice.size());
}
popSpin.showAtLocation(laySpin, Gravity.NO_GRAVITY, xPos, yPos);
}
private OnItemClickListener listListener = new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
mLastPos = arg2;
pThis.setText(((TextView)arg1).getText().toString());
popSpin.dismiss();
}
};
public int getLastPosition(){
return mLastPos;
}