установить переменную после создания контекстного меню - PullRequest
0 голосов
/ 20 февраля 2012

Я создаю деки. Когда я нажимаю на кнопку, воспроизводится звуковой файл, и selectedSoundId определяется как soundIds[i];

Если я долго нажму кнопку, до того, как кнопка будет нажата, selectedSoundId не будет определено. Поэтому мне нужно определить его, даже если я не «нажал» кнопку.

Я понял, что должен определить это после "onCreateContextMenu", но как?

public class Activity2 extends TabActivity {

    /** Called when the activity is first created. */
    int selectedSoundId;
    int random = (int)Math.ceil(Math.random()*100);

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        this.setVolumeControlStream(AudioManager.STREAM_MUSIC);  

        //Look up the AdView as a resource and load a request.
        AdView adView = (AdView)this.findViewById(R.id.adView);
        adView.loadAd(new AdRequest());

        TabHost mTabHost = getTabHost();

        mTabHost.addTab(mTabHost.newTabSpec("tab1").setIndicator("text1").setContent(R.id.tab1));
        mTabHost.addTab(mTabHost.newTabSpec("tab2").setIndicator("text2").setContent(R.id.tab2));
        mTabHost.addTab(mTabHost.newTabSpec("tab3").setIndicator("text3").setContent(R.id.tab3));
        mTabHost.addTab(mTabHost.newTabSpec("tab4").setIndicator("text4").setContent(R.id.tab4));

        mTabHost.setCurrentTab(0);

        final MediaPlayer player = new MediaPlayer();
        final Resources res = getResources();

        //just keep them in the same order,
        final int[] buttonIds = { R.id.button1, R.id.button2,};
        final int[] soundIds = { R.raw.sound1, R.raw.sound2, };

        View.OnClickListener listener = new View.OnClickListener() {
            public void onClick(View v) {
                //find the index that matches the button's ID, and then reset
                //the MediaPlayer instance, set the data source to the corresponding
                //sound effect, prepare it, and start it playing.
                for(int i = 0; i < buttonIds.length; i++) {
                    if(v.getId() == buttonIds[i]) {
                        selectedSoundId = soundIds[i];
                        AssetFileDescriptor afd = res.openRawResourceFd(soundIds[i]);
                        player.reset();
                        try {
                            player.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
                        } catch (IllegalArgumentException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (IllegalStateException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        try {
                            player.prepare();
                        } catch (IllegalStateException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        player.start();

                        break;
                    }
                }
            }
        };
      //set the same listener for every button ID, no need
        //to keep a reference to every button
        for(int i = 0; i < buttonIds.length; i++) {
            Button soundButton = (Button)findViewById(buttonIds[i]);
            registerForContextMenu(soundButton);
            soundButton.setOnClickListener(listener);

        }



    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {
     super.onCreateContextMenu(menu, v, menuInfo);
     menu.setHeaderTitle("Save as...");
     menu.add(0, v.getId(), 0, "Ringtone");
     menu.add(0, v.getId(), 0, "Notification");

// How do I give SelectedsoundId here the value of soundIds[i]
 //Like : selectedSoundId = soundIds[i];

    }

UPDATE

Я добавил этот код в OnCreateContextMenu и теперь он работает правильно. Я не уверен, что v.getId(); необходим?

 v.getId();
     for(int i = 0; i < buttonIds.length; i++) {
           if(v.getId() == buttonIds[i]) {
               selectedSoundId = soundIds[i];
           }
       }

1 Ответ

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

Метод onCreateContextMenu() имеет параметр с именем View v, представляющий View, для которого строится ContextMenu. Таким образом, из этого вы можете получить идентификатор (v.getId()), а затем, как вы это сделали в View.OnClickListener listener, выяснить позицию в массиве buttonIds и затем установить selectedSoundId соответственно.

Также это:

menu.add(0, v.getId(), 0, "Ringtone");

должно быть примерно так:

menu.add(Menu.NONE, UNIQUE_ID, Menu.NONE, "Ringtone");

Edit:

В коде, который вы добавили, я вижу строку v.getId(); перед циклом for, в этом нет необходимости. Что касается редактирования моего меню, вы должны назначить уникальный идентификатор для вашего пункта меню, чтобы в методе onContextItemSelected() вы могли узнать, какой пункт меню выбирает пользователь ( см. Этот класс в качестве примера ). В других полях вы можете использовать 0 или Menu.NONE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...