1

私はこの方法を持っています:

void showAllSongsMenu() {
    if (rebuilding) {
        Toast.makeText(MusicPlayerActivity.this,
                "Database rebuild in progress, please wait!",
                Toast.LENGTH_SHORT).show();
        return;
    }
    LayoutInflater layoutInflater = (LayoutInflater) getBaseContext()
            .getSystemService(LAYOUT_INFLATER_SERVICE);
    final View popupView = layoutInflater.inflate(R.layout.allsongs_list,
            null);
    allSongs = new PopupWindow(popupView, LayoutParams.FILL_PARENT,
            LayoutParams.FILL_PARENT, true);
    Button allSongsMenu = (Button) allSongs.getContentView().findViewById(
            R.id.close_all_songs_menu);
    allSongs.setBackgroundDrawable(MusicPlayerActivity.this.getResources()
            .getDrawable(R.drawable.unknown_artist));
    allSongs.setFocusable(true);
    allSongsMenu.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            allSongs.dismiss();
        }

    });
    ListView lv = (ListView) allSongs.getContentView().findViewById(
            R.id.all_songs_list);
    //registerForContextMenu(lv);
    lv.setOnCreateContextMenuListener(new OnCreateContextMenuListener(){

        @Override
        public void onCreateContextMenu(ContextMenu menu, View v,
                ContextMenuInfo menuInfo) {
            menu.setHeaderTitle("Song options");
            menu.add(0, v.getId(), 0, "enqueue song");
            menu.add(0, v.getId(), 0, "song info");
            menu.add(0, v.getId(), 0, "cancel action");
        }});
    lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {
            currentTrack = arg2;
            loadTrack();
            if (isTuning)
                if (track != null)
                    track.pause();
            isTuning = true;
            btnPlay.setBackgroundResource(R.drawable.pause);
            playTrack();
            allSongs.dismiss();
        }

    });
    base.getAllData();
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
            R.layout.simple_row, base.getNames());
    lv.setAdapter(adapter);
    allSongs.showAtLocation(trackInfo, Gravity.CENTER, 0, -30);
}

ContextMenu は表示されません。onContextItemSelected も実装していますが、メニューが表示されないため機能しません。このメソッドは、この PopupWindow が必要なときに呼び出され、オプションの 1 つとして OptionsMenu から呼び出されます。また、リスナーなしでコンテキストメニューイベントのリストビューを登録しようとしましたが、どちらも機能しませんでした。

4

2 に答える 2

0

この全体の問題は、PoupWindow で ListView の ContextMenu を起動したいということです。それが、他のいくつかのことでも私に問題を引き起こした理由です。アクティビティのメイン ウィンドウに ListView を表示する方法はありますか (または、リストの操作が完了するまでアクティビティのメイン ビューを切り替えることもできます)、ポップアップ ウィンドウでは使用しませんか?

これは私のダイアログです

package rs.ac.bg.etf.musicplayer.dialogs;

import android.app.Dialog;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;
import rs.ac.bg.etf.musicplayer.*;
import rs.ac.bg.etf.musicplayer.database.MusicDatabase;

public class AllSongsDialog extends Dialog implements OnClickListener {
MusicPlayerActivity act;
Button cancel;
ListView lv;

public AllSongsDialog(MusicPlayerActivity act) {
    super(act);
    this.act = act;
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.dialog_allsongs);
    cancel = (Button) findViewById(R.id.close_allsongs_dialog);
    cancel.setOnClickListener(this);
    lv = (ListView) findViewById(R.id.all_songs_list);
    lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View v, int pos,
                long arg3) {
            act.setCurrentTrack(pos);
            act.loadTrack();
            if (act.isTuning())
                if (act.getTrack() != null)
                    act.getTrack().pause();
            act.setTuning(true);
            act.getBtnPlay().setBackgroundResource(R.drawable.pause);
            act.playTrack();
            dismiss();
        }

    });
    MusicDatabase base = act.getBase();
    base.getAllData();
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(
            this.getContext(), R.layout.simple_row, base.getNames());
    lv.setAdapter(adapter);
    registerForContextMenu(lv);
    setCancelable(true);
}

@Override
public void onClick(View v) {
    dismiss();
}

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

@SuppressWarnings("deprecation")
@Override
public boolean onContextItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.enqueue_song:
        Toast.makeText(getContext(), "Song enqueued!", Toast.LENGTH_SHORT)
                .show();
        return true;
    case R.id.song_info:

        return true;
    case R.id.cancel_menu:
        return true;
    }
    return false;
}

}

于 2013-10-18T11:29:50.740 に答える