如何动态添加按钮到弹出窗口?

时间:2013-06-09 18:04:15

标签: android android-linearlayout popupwindow dynamically-generated

我正在尝试编写一个打开弹出窗口的函数,并使用按钮链接填充该应用程序记录的所有先前图片或录制的音频文件。我尝试编写该函数,以便它可以用于音频文件或图像。目标是在屏幕上显示一个弹出窗口,其中包含每个先前文件的按钮,并在点击时打开指定的文件。该应用程序将成功打开弹​​出窗口,但它将仅由自动定义的按钮(后退)填充,该按钮将关闭弹出窗口。但是,后退按钮下方会出现空白区域,这会增加滚动视图的高度,并允许在弹出窗口中滚动,但实际上不会显示任何按钮。

最初,我的问题来自于不包括我的每个布局元素的pw.getContentView()(pw是我的弹出窗口),但我不确定它究竟做了什么,这可能是问题的一部分。< / p>

这是调用以打开弹出窗口的函数。

private void display_media(int check, String header_text){
    //The check variable is a 1 or 0 depending on if it's an image or an audio.
    // header_text is a simply text to replace the default header.
    try{
        LayoutInflater inflater = (LayoutInflater) NewPlan_Two.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View layout = inflater.inflate(R.layout.files_layout, (ViewGroup) findViewById(R.id.show_media));
        pw = new PopupWindow(layout,width/4,height/3,true);//width and height are predefined values

        Button close_button = (Button) layout.findViewById(R.id.back_scroll);
        close_button.setOnClickListener(close_view);
        TextView header =(TextView) pw.getContentView().findViewById(R.id.previous_files);
        header.setText(header_text);

        LinearLayout l_l = (LinearLayout) pw.getContentView().findViewById(R.id.scroll_linear);
        for(String media_file: files){ // this is defined and explained below
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
                    LinearLayout.LayoutParams.WRAP_CONTENT);
            Button new_button = new Button(this);
            if(check==0){
                new_button.setId(image_id_count);
                image_id_count++; // this is initialized to 3000
                button_id = new_button.getId();
            }
            else{
                new_button.setId(audio_id_count);
                audio_id_count++; // this is initialized to 2000
                button_id = new_button.getId();
            }
            new_button.setText(media_file);
            l_l.addView(new_button,params);

            if(check==0)
                button_two= (Button) pw.getContentView().findViewById(button_id);
            else
                button_two = (Button) pw.getContentView().findViewById(button_id);
            button_two.setOnClickListener(new View.OnClickListener(){
                @Override
                public void onClick(View v) {
                    pw.dismiss(); 
                    // this will be replaced with code to open the image or audio, but I haven't written it yet.
                }   
            });         

        } 
        pw.showAtLocation(layout, Gravity.CENTER, 0, 0);

    }catch(Exception e){
        e.printStackTrace();
    }
}

要解析音频或图像文件,我使用此功能。它成功获取文件的名称。它以“mp4”或“png”作为参数调用。

private void parse_Files(String fileType){
    files = new ArrayList<String>();
    File folder = new File(abs_path); // abs_path is the path to the folder with the files
    File[] list_of_files = folder.listFiles();
    for(int count = 0; count < list_of_files.length;count++){   
        String file_name = list_of_files[count].getName();
        String[] parsed_list = file_name.split("\\.");
        if(parsed_list[1].equals(fileType))
            files.add(parsed_list[0]);
    }
}

最后,这是作为弹出窗口打开的xml文件。

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

<TextView
    android:id="@+id/previous_files"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
    android:text="@string/previous_files"
    android:textSize="20sp"/>
<ScrollView android:layout_height="wrap_content" android:layout_width="match_parent" android:background="#FFFFFF" >

    <LinearLayout android:layout_height="wrap_content" android:layout_width="match_parent" android:id="@+id/scroll_linear">

        <Button 
             android:id="@+id/back_scroll"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:text="@string/back"
             android:textSize="18sp"/>
    </LinearLayout>

</ScrollView>      

</LinearLayout>

谢谢!

编辑:

我尝试将其更改为列表视图,但我遇到了同样的问题。它会打开一个弹出窗口,并且有x个按钮对应于x相关文件,但没有任何按钮有文本或点击时执行任何操作。我错过了什么?

以下是修订后的代码:

private void display_media(int check, String header_text){
    try{
        display_media_array=new String[files.size()];
        display_media_array=files.toArray(display_media_array);

        LayoutInflater inflater = (LayoutInflater) NewPlan_Two.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View layout = inflater.inflate(R.layout.files_layout, null);
        pw = new PopupWindow(layout,LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT,true);

        ListView listView = (ListView) layout.findViewById(R.id.list_view);
        listView.setAdapter(new ArrayAdapter<String>(getApplicationContext(),
                android.R.layout.simple_list_item_1, display_media_array));
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1,
                    int arg2, long arg3) {
                pw.dismiss();                   
            }
        });

        Button close_button = (Button) layout.findViewById(R.id.back_scroll);
        close_button.setOnClickListener(close_view);
        TextView header =(TextView) pw.getContentView().findViewById(R.id.previous_files);
        header.setText(header_text);

        pw.showAtLocation(layout, Gravity.CENTER, 0, 0);

    }catch(Exception e){
        e.printStackTrace();
    }
}

这是新的xml文件:

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

<TextView
    android:id="@+id/previous_files"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
    android:text="@string/previous_files"
    android:textSize="20sp" />

    <ListView
        android:id="@+id/list_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="#FFFFFF" >
    </ListView>

<Button
    android:id="@+id/back_scroll"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@string/back"
    android:textSize="18sp" />

</LinearLayout>

感谢任何帮助,谢谢!

0 个答案:

没有答案