6
A
答えて
4
Spinnerを拡張し、AlertDialogの位置を変更する必要があります(クリックしたときのスピナーはalertDialogとして機能します)。
コード(ちょうど位置よりも少しをし、それはまた、開かれたスピナーの背景を設定します):
public class CustomSpinner extends Spinner {
private AlertDialog mPopup;
public CustomSpinner(Context context) {
super(context);
}
public CustomSpinner(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomSpinner(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
if (mPopup != null && mPopup.isShowing()) {
mPopup.dismiss();
mPopup = null;
}
}
//when clicked alertDialog is made
@Override
public boolean performClick() {
Context context = getContext();
AlertDialog.Builder builder = new AlertDialog.Builder(context);
CharSequence prompt = getPrompt();
if (prompt != null) {
builder.setTitle(prompt);
}
mPopup = builder.setSingleChoiceItems(
new DropDownAdapter(getAdapter()),
getSelectedItemPosition(), this).show();
WindowManager.LayoutParams WMLP = mPopup.getWindow().getAttributes();
//width and height must be set to anything other than WRAP_CONTENT!
WMLP.x = 0; // x position
WMLP.y = 50; // y position
WMLP.height =390 ; //LayoutParams.WRAP_CONTEN
WMLP.width = 315;
WMLP.horizontalMargin = 0;
WMLP.verticalMargin = 0;
mPopup.getWindow().setAttributes(WMLP);
//ListView.getDefaultSize(size, measureSpec)
ListView listView = mPopup.getListView();
//listView.set
// Remove divider between rows
listView.setDivider(null);
// Set custom background
listView.setBackgroundResource(R.drawable.drop);
// Remove background from all (grand)parent's
ViewParent parent = listView.getParent();
while (parent != null && parent instanceof View) {
((View) parent).setBackgroundDrawable(null);
parent = parent.getParent();
}
return true;
}
@Override
public void onClick(DialogInterface dialog, int which) {
setSelection(which);
dialog.dismiss();
mPopup = null;
}
* <p>Wrapper class for an Adapter. Transforms the embedded Adapter instance
* into a ListAdapter.</p>
*/
private static class DropDownAdapter implements ListAdapter, SpinnerAdapter {
private SpinnerAdapter mAdapter;
/**
* <p>Creates a new ListAddapter wrapper for the specified adapter.</p>
*
* @param adapter the Adapter to transform into a ListAdapter
*/
public DropDownAdapter(SpinnerAdapter adapter) {
this.mAdapter = adapter;
}
public int getCount() {
return mAdapter == null ? 0 : mAdapter.getCount();
}
public Object getItem(int position) {
return mAdapter == null ? null : mAdapter.getItem(position);
}
public long getItemId(int position) {
return mAdapter == null ? -1 : mAdapter.getItemId(position);
}
public View getView(int position, View convertView, ViewGroup parent) {
return getDropDownView(position, convertView, parent);
}
public View getDropDownView(int position, View convertView, ViewGroup parent) {
return mAdapter == null ? null :
mAdapter.getDropDownView(position, convertView, parent);
}
public boolean hasStableIds() {
return mAdapter != null && mAdapter.hasStableIds();
}
public void registerDataSetObserver(DataSetObserver observer) {
if (mAdapter != null) {
mAdapter.registerDataSetObserver(observer);
}
}
public void unregisterDataSetObserver(DataSetObserver observer) {
if (mAdapter != null) {
mAdapter.unregisterDataSetObserver(observer);
}
}
/**
* <p>Always returns false.</p>
*
* @return false
*/
public boolean areAllItemsEnabled() {
return true;
}
/**
* <p>Always returns false.</p>
*
* @return false
*/
public boolean isEnabled(int position) {
return true;
}
public int getItemViewType(int position) {
return 0;
}
public int getViewTypeCount() {
return 1;
}
public boolean isEmpty() {
return getCount() == 0;
}
}
}
次に、あなただけのように「yourPackage.CustomSpinner」要素を使用して、レイアウトにそれを挿入しなきゃ:
<yourPackage.CustomSpinner
android:layout_height="wrap_content"
android:id="@+id/spinner"
android:layout_width="fill_parent">
</yourPackage.CustomSpinner>
25
ドロップダウンとしてスピナーモードを宣言します。
android:spinnerMode="dropdown"
その後、使用します垂直方向のギャップを埋めるためのオフセット:あなたはこれを使用することができます
android:dropDownVerticalOffset="-15dp"
0
ドロップダウンスピナーモードの場合:
mSortingSpinner.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
mSortingSpinner.setDropDownVerticalOffset(
mSortingSpinner.getDropDownVerticalOffset() + mSortingSpinner.getHeight());
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) {
mSortingSpinner.getViewTreeObserver().removeOnGlobalLayoutListener(this);
} else {
mSortingSpinner.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
}
});
このセット垂直スピナー高さでドロップダウンのオフセット。
関連する問題
- 1. コルドーバスプラッシュスクリーンはスピナーの位置を変更しますか?
- 2. オリエンテーションの変更によってスピナーの位置が変更される
- 3. cordova-plugin-splashscreenでスピナーの位置を変更する - Android
- 4. ナンバースクリプトでサイドドロワーの位置/位置を変更するには
- 5. Colourscale:転移開始位置を変更
- 6. Android - スピナーの位置の値
- 7. 開かれたポップアップの位置を観察するには?
- 8. TreeViewで展開された項目の位置を変更する
- 9. 変更CSSトランジション開始と位置
- 10. Cytoscape.js:レンダリングされた位置をモデル位置に変換する
- 11. 2つのスピナーの位置を逆にする方法は?
- 12. 変更位置
- 13. メニューとスピナーの位置について!
- 14. アンドロイドでの位置変更のマーカー位置を変更する方法
- 15. ImageViewの行列による位置の変更位置の変更
- 16. スピナーのダイアログスタイルを変更するには?
- 17. 他のスピナーが変更されたときにスピナーを選択する
- 18. チェックマークの位置の変更、または「glyphicon-ok」アイコンの変更
- 19. モーダル/ポップアップクリック前にスクロールすると開始位置が変更される
- 20. SKActionの開始位置の変更を繰り返します。
- 21. nsisのショートカットの開始位置を変更するにはどうすればよいですか?
- 22. 配置後にSKSpriteNodeの位置が変更される
- 23. トグルの開始位置を変更するにはどうすればよいですか?
- 24. UIImageViewの位置を変更する
- 25. ステータスバーの位置を変更する
- 26. Openstreetmaps LayerSwitcherの位置を変更する
- 27. ブートストラップナビバーの位置を変更する
- 28. HTML - フォームの位置を変更する
- 29. Windows。ドロップダウンメニューの位置を変更する
- 30. ブートストラップのツールチップ位置を変更する
-15dpの使用をどのように知っていましたか? –
それは私が恐れている魔法の数です。試行錯誤して、正しい番号/実装を探す必要があります。 – Tr0yJ
それは本当に私のために働いたおかげで... –