如何在Android中点击按钮时显示下拉菜单?

3

你好,我最近开始接触Android技术,在我的应用程序中有两个按钮(一个用于显示电影列表,另一个用于显示国家列表)。

当我点击第二个按钮时,我想像下面第一张图片中那样在spinner列表中显示电影列表。

但是根据我的代码,当我点击按钮时,首先出现spinner,我选择其中任何一个项目并将其设置为我的按钮标题,但是在选择后spinner仍然可见,就像我的第二个屏幕一样,如何删除它。

我该如何解决这个问题?

请帮助我。

我希望在点击按钮时直接显示spinner列表。

XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:padding="10dp"
    android:id="@+id/parentLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/button1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="Button1Action"
        android:text="CountiesList"/>

    <Spinner
        android:visibility="gone"
        android:id="@+id/spinner1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/mainLayout"
        android:layout_alignParentRight="true"
        android:paddingRight="0dp"
        android:layout_marginTop="5dp"
        />

    <Button
        android:id="@+id/button2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="Button2Action"
        android:text="MoviesList"/>

    <Spinner
        android:visibility="gone"
        android:id="@+id/spinner2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/mainLayout"
        android:layout_alignParentRight="true"
        android:paddingRight="0dp"
        android:layout_marginTop="5dp"
        />

</LinearLayout>

activity:-

public class spinnerListProgramatically extends AppCompatActivity{

    String [] countriesList = {"india","usa","england"
    };

    String [] moviesList = {"fury","300 rise of an empire","troy"
    };
    Spinner spinner1,spinner2;

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

    public void Button1Action(View view){

        spinner1  = (Spinner)findViewById(R.id.spinner1);
        ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, countriesList);
        dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner1.setAdapter(dataAdapter);
        spinner1.setVisibility(View.VISIBLE);
    }

    public void Button2Action(View view){

        spinner2  = (Spinner)findViewById(R.id.spinner2);
        ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, moviesList);
        dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner2.setAdapter(dataAdapter);
        spinner2.setVisibility(View.VISIBLE);
    }
}

enter image description here

---enter image description here


你有两个Spinner和两个按钮,为什么不同时初始化它们呢?我的意思是在onCreate中将它们都初始化,然后根据需要更改它们的可见性。 - Shree Krishna
我对Android非常新,请告诉我一些用户建议和一些代码。我想在点击按钮时显示Spinner列表,而不需要任何用户交互。 - Krish
请点击以下链接:https://dev59.com/5mEi5IYBdhLWcg3wd8Ku - Vivek Mishra
Vivek Mishra,我知道如何在点击按钮时显示SpinnerList,但我的问题不是这个,请仔细看清楚。 - Krish
你是想在按钮被点击后展示相同的加载图标但不同的数据吗? - Shree Krishna
显示剩余10条评论
6个回答

9

为什么不移除 Spinner,只使用一个 Button 呢?同时有一个 SpinnerButton 是没有意义的。

根据您展示的图片,您需要使用 PopupMenu

public void Button2Action(View view){
    showFilterPopup(view);
}

private void showPopup(View v) {
    PopupMenu popup = new PopupMenu(this, v);
    // Inflate the menu from xml
    popup.getMenuInflater().inflate(R.menu.popup, popup.getMenu());
    // Setup menu item selection
    popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
        public boolean onMenuItemClick(MenuItem item) {
            switch (item.getItemId()) {
            case R.id.troy:
              Toast.makeText(MainActivity.this, "troy", Toast.LENGTH_SHORT).show();
              return true;
            case R.id.rise:
              Toast.makeText(MainActivity.this, "300 Rise of Empire", Toast.LENGTH_SHORT).show();
              return true;
            default:
              return false;
            }
        }
    });
    // Handle dismissal with: popup.setOnDismissListener(...);
    // Show the menu
    popup.show();
  }

你的R.menu.popup将包含你需要的每个项目。

当你有静态数据集时,这种方法会很有用。

通过几个简单的步骤,你可以使它变得动态。希望这能帮到你。


哦,你的意思是Spinner不适合满足我的需求? - Krish

5
使用这个技术来工作
  public void Button1Action(View view){


        ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, countriesList);
        dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner1.setAdapter(dataAdapter);
        spinner1.setVisibility(View.INVISIBLE);

        spinner1.performClick();
    }

    public void Button2Action(View view){


        ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, moviesList);
        dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner2.setAdapter(dataAdapter);
        spinner2.setVisibility(View.INVISIBLE);


        spinner2.performClick();

    }

查看此屏幕

可以将其设置为屏幕显示。

在这里输入图片描述


我只想要可见的Spinner列表,不想要可见的Spinner提示。 - Krish
@Krish 意味着您不想在Spinner中显示selectedItem,只想显示ListItem。 - user6011162
你想要使用Spinner吗? - user6011162
是的,我想要一个Spinner,我的需求不可能通过Spinner实现吗? - Krish
将Spinner的可见性设置为INVISIBLE,请查看我的答案? - user6011162
显示剩余11条评论

3

好的,经过长时间的讨论,我终于知道了你真正想要说的话。我已经提供了优化并稍作修改的完整源代码。

XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:padding="10dp"
    android:layout_marginTop="50dp"
    android:id="@+id/parentLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/button1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="Button1Action"
        android:text="CountiesList"/>

    <Spinner

        android:visibility="invisible"
        android:id="@+id/spinner1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        />

    <Spinner
        android:visibility="gone"
        android:id="@+id/spinner2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"    
        android:layout_marginTop="5dp"
        />

    <Button
        android:id="@+id/button2"    
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="Button2Action"
        android:text="MoviesList"/>

</LinearLayout>

你的活动

public class spinnerListProgramatically extends AppCompatActivity {
    Button button1, button2;
    String [] countriesList = {"NONE","india","usa","england"};
    String [] moviesList = {"NONE","fury","300 rise of an empire","troy" };
    Spinner spinner1,spinner2;

 @Override
    protected void onCreate(Bundle savedInstanceState) {
   //Your other setup codes
          spinner1  = (Spinner)findViewById(R.id.spinner1);
        spinner2  = (Spinner)findViewById(R.id.spinner2);
        button1 = (Button) findViewById(R.id.button1);
        button2 = (Button) findViewById(R.id.button2);
}

public void Button1Action(View view){
   ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, countriesList);
    dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
     spinner1.setAdapter(dataAdapter);
     spinner1.setVisibility(View.VISIBLE);
     spinner1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                if(position!=0) {
                    button1.setText(countriesList[position]);
                    spinner1.setVisibility(View.GONE);
                }
            }

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

  public void Button2Action(View view){   
    ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, moviesList);
     dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);  
     spinner2.setAdapter(dataAdapter);
     spinner2.setVisibility(View.VISIBLE);
     spinner2.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                if(position!=0) {
                    button2.setText(moviesList[position]);
                    spinner2.setVisibility(View.GONE);
                }
            }

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

            }
        });    
}

你为什么一个接一个地打勾? - Shree Krishna
那是一种替代方案,而非您的要求。但没关系,我不会介意。 - Shree Krishna

2

不需要点击下拉框就能显示Spinner-List项目

Spinner spi_type = findViewById(R.id.spi_type);
Button button = findViewById(R.id.button);
imgVIcon.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               // performClick() this method show Spinner-List item without tap on spinner
                spi_type.performClick();
            }
        });

0

无法评论,因为我的声望不够高...您能更具体地说明您想要实现什么吗?

问题是

   if(spinner2.getSelectedItem() == null) 

不是空值.. 它默认使用第一个值

所以请使用这段代码

   if(spinner2.getSelectedItem() == "fury") {
        // for checking user havent selected anything
        spinner2.performClick();
    }

  if(spinner1.getSelectedItem() == "india") {
        // for checking user havent selected anything
        spinner1.performClick();
    }

以及为按钮设置标题

    public void Button1Action(View view){
    ArrayAdapter<String> dataAdapter1 = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, countriesList);
    dataAdapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner1.setAdapter(dataAdapter1);

    spinner1.setVisibility(View.VISIBLE);
    String s = (String) spinner1.getSelectedItem();
    spinner1.performClick();

    spinner1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            button.setText(""+ spinner1.getSelectedItem());
        }

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

        }
    });

}

在按钮的 onClick 中, 并且在 onCreate 中初始化按钮

    button = (Button) findViewById(R.id.button1);
    button1 = (Button) findViewById(R.id.button2);

而且放置适配器也不是问题。


为什么你要添加多个答案而不是编辑第一个答案? - Shree Krishna
我不想在Spinner中显示selectedItem,只想显示ListItem。 - Krish
我不想在Spinner中显示selectedItem,只想显示ListItem。 - Krish
@Krish,你能具体说明一下你想要实现什么吗? - Sanoop Surendran
我不想在选择后在按钮之间显示那个旋转图标。 - Krish
显示剩余9条评论

-3

在此输入图片描述 在按钮onClick方法之前查找旋转器并设置适配器。


你想说什么?我不理解。 - Krish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接