Android微调器垂直偏移已更改

时间:2017-07-27 12:46:40

标签: android spinner

我在标题下使用SpinnerTextView)。它最初设置为View.GONE,当点击标题时,Spinner设置为View.VISIBLE,弹出窗口使用标题下方的performClick()显示,这就是我想。

但我异步更新BaseAdapter,以便在SpinnerVISIBLE添加更多项目。更新后,Spinner向上移动并覆盖在标题上。我该如何解决这个问题?

我使用了android:dropDownVerticalOffset,但在更新后显示了相同的行为。

我的布局:

 <LinearLayout 
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical">

<TextView
    android:id="@+id/title"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <LinearLayout
        android:id="@+id/some_other_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">
    </LinearLayout>

    <android.support.v7.widget.AppCompatSpinner
        android:id="@+id/spinner"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:animateLayoutChanges="true"
        android:background="@null"
        android:overlapAnchor="true"
        android:spinnerMode="dropdown"
        android:visibility="gone"></android.support.v7.widget.AppCompatSpinner>
</FrameLayout>
</LinearLayout>

2 个答案:

答案 0 :(得分:0)

确定。 我尝试通过手机上的一些小调整来解决问题,我发现没有问题。 为了模拟你的异步添加项目,我添加了一个按钮。它的OnClick将向适配器添加项目。 接下来,我只使用了ArrayAdapter而不是扩展BaseAdapter。 而且,我刚刚为LinearLayout添加了权重,以帮助我进行布局外观。

这是布局:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
>


        <TextView
            android:id="@+id/title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Title"
            android:textSize="20dp"
            android:gravity="center"
            android:textColor="@android:color/black"
        />

        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            >

            <LinearLayout
                android:id="@+id/some_other_layout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical">
            </LinearLayout>

            <android.support.v7.widget.AppCompatSpinner
                android:id="@+id/spinner"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:animateLayoutChanges="true"
                android:background="@null"
                android:overlapAnchor="true"
                android:spinnerMode="dropdown"></android.support.v7.widget.AppCompatSpinner>
        </FrameLayout>
    <Button
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:text="Load Adapter"
        android:id="@+id/button"
    />

</LinearLayout>

以下是活动代码:

public class MainActivity extends AppCompatActivity {

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


    Spinner spinner;
    Button button;

    @Override
    protected void onResume() {
        super.onResume();
        spinner = (Spinner) findViewById(R.id.spinner);
        button = (Button) findViewById(R.id.button);

        List<String> list = new ArrayList<>();
        list.add(getRandomStringInRange('A','Z',5));
        ArrayAdapter<String> adapter= new ArrayAdapter(MainActivity.this,android.R.layout.simple_spinner_item,list);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ArrayAdapter<String> adapter = (ArrayAdapter<String>) spinner.getAdapter();
                adapter.add(getRandomStringInRange('A','Z',5));
            }
        });

    }
    public int getRandomNumberInRange(int lower,int higher){
        int range = higher-lower;
        range=(int)(range*Math.random());
        return lower + range;
    }

    public String getRandomStringInRange(char lower,char higher,int length){

        String str ="";
        for(int i=0;i<length;i++)
            str+=(char)(getRandomNumberInRange(lower,higher));
        return str;
    }

}

我没有发现微调器与标题重叠或者根本没有移动。

工作正常。

如果您愿意,我会给您发送截图。 如果您遇到任何其他问题,请告诉我

答案 1 :(得分:0)

我真的找不到解决方案。但是通过设置微调器的固定高度来解决,如in this solution.

所述
Spinner spinner = (Spinner) findViewById(R.id.spinner);
try {
    Field popup = Spinner.class.getDeclaredField("mPopup");
    popup.setAccessible(true);

    // Get private mPopup member variable and try cast to ListPopupWindow
    android.widget.ListPopupWindow popupWindow = (android.widget.ListPopupWindow) popup.get(spinner);

    // Set popupWindow height to 500px
    popupWindow.setHeight(500);
}
catch (NoClassDefFoundError | ClassCastException | NoSuchFieldException | IllegalAccessException e) {
    // silently fail...
}