Android: контекстное меню + просмотр списка файлов - PullRequest
0 голосов
/ 09 февраля 2012

У меня проблема со списком просмотра, который показывает медиа-файлы папки ... Я попытался решить эту проблему с помощью расширяемого списка (расходные элементы должны вести себя как контекстное меню), но ужасно не получилось ... поэтому я решил сделать это простым способом через контекстное меню ..

Список получает свои элементы, читая папку и фильтруя mp3 и wav - файлы. теперь контекстное меню должно иметь опции «играть», «остановить» и «удалить» Я разобрался, как заставить файл воспроизводиться через onListItemClick, но я не совсем понял, как правильно разместить опции в contextmenu и назначить ему свой список. вот код пока. заранее спасибо за помощь.

import android.media.MediaPlayer;
import android.os.Bundle;
import android.widget.TextView;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
import android.app.AlertDialog;
import android.app.ListActivity;
import android.content.DialogInterface;
import android.util.Log;
import android.view.ContextMenu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import android.widget.AdapterView.AdapterContextMenuInfo;

class Mp3WavFilter implements FilenameFilter {
    public boolean accept(File dir, String name) {
        return Pattern.matches(".*\\.(wav|mp3)", name);

    }
}


public class TabAufnahmen extends ListActivity {

    private static final String MEDIA_PATH = new String("/sdcard/Babyaufnahmen/");
    private List<String> songs = new ArrayList<String>();
    private MediaPlayer mp = new MediaPlayer();
    TextView selection;

    ListView list = (ListView)findViewById(R.id.list);

    @Override
    public void onCreate(Bundle icicle) {
        try {
            super.onCreate(icicle);
            setContentView(R.layout.songlist);
            updateSongList();
        } catch (NullPointerException e) {
            Log.v(getString(R.string.app_name), e.getMessage());
        }
    }

    public void updateSongList() {
        File home = new File(MEDIA_PATH);
        if (home.listFiles( new Mp3WavFilter()).length > 0) {
            for (File file : home.listFiles( new Mp3WavFilter())) {
                songs.add(file.getName());
            }


            /*ArrayAdapter<String> songList = new ArrayAdapter<String>(this,R.layout.song_item, songs);
            list.setAdapter(songList);
            //list.setListAdapter(songList);
            registerForContextMenu(list);*/


           /* setListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, songs));
            selection=(TextView)findViewById(R.id.selection);

            registerForContextMenu(getListView());*/

        }       
    }


/*  @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        try {

            mp.reset();
            mp.setDataSource(MEDIA_PATH + songs.get(position));
            mp.prepare();
            mp.start();
        } catch(IOException e) {
            Log.v(getString(R.string.app_name), e.getMessage());
        } 
    }*/




    /*public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.context_menu, menu);
    }*/


    /*public boolean onContextItemSelected(MenuItem item) {
        AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
        String[] names = getResources().getStringArray(R.array.names);
        switch(item.getItemId()) {
        case R.id.abspielen:
            Toast.makeText(this, "You have chosen the " + getResources().getString(R.string.abspielen) + 
                    " context menu option for " + names[(int)info.id],
                    Toast.LENGTH_SHORT).show();
            return true;
        case R.id.anhalten:
            Toast.makeText(this, "You have chosen the " + getResources().getString(R.string.anhalten) + 
                    " context menu option for " + names[(int)info.id],
                    Toast.LENGTH_SHORT).show();
            return true;
        case R.id.loeschen:
            Toast.makeText(this, "You have chosen the " + getResources().getString(R.string.loeschen) + 
                    " context menu option for " + names[(int)info.id],
                    Toast.LENGTH_SHORT).show();
            return true;
        default:
            return super.onContextItemSelected(item);
        }
    }*/



}

Ответы [ 2 ]

1 голос
/ 10 февраля 2012

спасибо за помощь, разобрался наконец.тем не менее, есть еще что-то, что беспокоит меня ... при использовании delete файл удаляется правильно, но список не обновляется .. также - есть ли способ генерировать список периодически?

class Mp3WavFilter implements FilenameFilter {
    public boolean accept(File dir, String name) {
        return Pattern.matches(".*\\.(wav|mp3)", name);

    }
}


public class TabAufnahmen extends ListActivity {

    private static final String MEDIA_PATH = new String("/sdcard/Babyaufnahmen/");
    private List<String> songs = new ArrayList<String>();
    private MediaPlayer mp = new MediaPlayer();

    @Override
    public void onCreate(Bundle icicle) {
        try {
            super.onCreate(icicle);
            //setContentView(R.layout.songlist);
            updateSongList();
        } catch (NullPointerException e) {
            Log.v(getString(R.string.app_name), e.getMessage());
        }
    }

    public void updateSongList() {
        File home = new File(MEDIA_PATH);
        if (home.listFiles( new Mp3WavFilter()).length > 0) {
            for (File file : home.listFiles( new Mp3WavFilter())) {
                songs.add(file.getName());
            }

            ArrayAdapter<String> songList = new ArrayAdapter<String>(this,R.layout.song_item,songs);
            this.setListAdapter(songList);
            registerForContextMenu(getListView());
        }       
    }
    //der player
    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        //try {

            mp.reset();
            //mp.setDataSource(MEDIA_PATH + songs.get(position));
            //mp.prepare();
            //mp.start();
        //} catch(IOException e) {
        //  Log.v(getString(R.string.app_name), e.getMessage());
        //} 
    }




    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.context_menu, menu);
    }


    public boolean onContextItemSelected(MenuItem item) {
        AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
    //  String[] names = getResources().getStringArray(R.array.);
        switch(item.getItemId()) {
        case R.id.abspielen:
            Toast.makeText(this, "Sie haben " + getResources().getString(R.string.abspielen) + "für die Datei" + getListView().getAdapter().getItem(info.position).toString() + " gewählt",
                    Toast.LENGTH_LONG).show();
            try {

                mp.reset();
                mp.setDataSource(MEDIA_PATH + getListView().getAdapter().getItem(info.position).toString());
                mp.prepare();
                mp.start();
            } catch(IOException e) {
                Log.v(getString(R.string.app_name), e.getMessage());
            } 

            return true;
        case R.id.loeschen:
            Toast.makeText(this, "Sie haben " + getResources().getString(R.string.loeschen) + "für die Datei" + getListView().getAdapter().getItem(info.position).toString() + " gewählt",
                    Toast.LENGTH_SHORT).show();
            File file = new File("/sdcard/Babyaufnahmen/" + getListView().getAdapter().getItem(info.position).toString());
            boolean deleted = file.delete();


            return true;
        default:
            return super.onContextItemSelected(item);

        }
    }



}
0 голосов
/ 09 февраля 2012

Если вы хотите открыть контекстное меню после долгого щелчка на элементе, вы можете просто зарегистрировать свой список для контекстного меню, используя registerForContextMenu (View) при инициализации.

И если вы хотите открыть контекстное меню onItemClick, тогда вы можете использовать openContextMenu для отображения контекстного меню.Вам также необходимо зарегистрировать контекстное меню для вашего просмотра.

...