Android: Проблема использовать несколько контекстное меню

Что у меня есть здесь реальное простое действие с двумя кнопками. При нажатии каждого из них, он играет звук.

Когда я нажимаю и удерживаю первую кнопку, она поднимает контекстное меню, спрашивая пользователя, если они хотят сохранить звук как вызывной тональный сигнал или уведомление. Это работает отлично над первой кнопкой.

Звук второй кнопки играет при нажатии. Когда долго нажатый это поднимает контекстное меню.... НО это сохранило первый звуковой файл как вызывной тональный сигнал/уведомление НЕ второе...

Кто-то смог бы потерять некоторое понимание на том, почему второе контекстное меню не работает правильно?

package com.my.app;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;import android.view.ContextMenu.ContextMenuInfo;  
import android.widget.Button;  
import android.widget.Toast; 
import android.app.Activity;
import android.content.ContentValues;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;


public class One extends Activity implements OnClickListener{

    private SoundManager mSoundManager;


   @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.one);

        mSoundManager = new SoundManager();
        mSoundManager.initSounds(getBaseContext());
        mSoundManager.addSound(1, R.raw.blah);
        mSoundManager.addSound(2, R.raw.rofl);


//BUTTONS PLAY SOUND WHEN PRESSED

        View SoundButton1 = findViewById(R.id.Sound1);
        SoundButton1.setOnClickListener(this);

        View SoundButton2 = findViewById(R.id.Sound2);
        SoundButton2.setOnClickListener(this);
 }

            public void onClick(View v) {
                switch (v.getId()) {

                case R.id.Sound1:
        mSoundManager.playSound(1);
                break;

            case R.id.Sound2:
    mSoundManager.playSound(2);
                break;
    }

//WHEN LONG PRESSED BUTTONS BRING UP CONTEXT MENU FOR SAVE AS RINGTONE OR NOTIFICATION

        Button SoundButton11 = (Button) findViewById(R.id.Sound1);  
        registerForContextMenu(SoundButton11);  

        Button SoundButton22 = (Button) findViewById(R.id.Sound2);  
        registerForContextMenu(SoundButton22);  
    }  
//CONTEXT MENU FOR BUTTON 1
    @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");  
    }  

    @Override  
    public boolean onContextItemSelected(MenuItem item) {  
        if(item.getTitle()=="Ringtone"){function1(item.getItemId());}  
        else if(item.getTitle()=="Notification"){function2(item.getItemId());}  
        else {return false;}  
    return true;  
    }  

    public void function1(int id){ 
        if (savering(R.raw.blah)){  
            // Code if successful  
            Toast.makeText(this, "Saved as Ringtone", Toast.LENGTH_SHORT).show();
            }  
            else  
            {  
            // Code if unsuccessful  
            Toast.makeText(this, "Failed - Check your SDCard", Toast.LENGTH_SHORT).show();
            }

    }  
    public void function2(int id){  
        if (savenot(R.raw.blah)){  
            // Code if successful  
            Toast.makeText(this, "Saved as Notification", Toast.LENGTH_SHORT).show();
            }  
            else  
            {  
            // Code if unsuccessful  
            Toast.makeText(this, "Failed - Check your SDCard", Toast.LENGTH_SHORT).show();
            }




//CONTEXT MENU FOR BUTTON 2 
    }

    public void onCreateContextMenu1(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");  
    }  

    public boolean onContextItemSelected1(MenuItem item) {  
        if(item.getTitle()=="Ringtone"){function11(item.getItemId());}  
        else if(item.getTitle()=="Notification"){function21(item.getItemId());}  
        else {return false;}  
    return true;  
    }  

    public void function11(int id){ 
        if (savering(R.raw.rofl)){  
            // Code if successful  
            Toast.makeText(this, "Saved as Ringtone", Toast.LENGTH_SHORT).show();
            }  
            else  
            {  
            // Code if unsuccessful  
            Toast.makeText(this, "Failed - Check your SDCard", Toast.LENGTH_SHORT).show();
            }

    }  
    public void function21(int id){  
        if (savenot(R.raw.rofl)){  
            // Code if successful  
            Toast.makeText(this, "Saved as Notification", Toast.LENGTH_SHORT).show();
            }  
            else  
            {  
            // Code if unsuccessful  
            Toast.makeText(this, "Failed - Check your SDCard", Toast.LENGTH_SHORT).show();
            }        


    }

   public boolean savering(int ressound){  
       byte[] buffer=null;  
       InputStream fIn = getBaseContext().getResources().openRawResource(ressound);  
       int size=0;  

       try {  
        size = fIn.available();  
        buffer = new byte[size];  
        fIn.read(buffer);  
        fIn.close();  
       } catch (IOException e) {  
        // TODO Auto-generated catch block  
        return false;  
       }  

       String path="/sdcard/media/audio/ringtones/";  
       String filename="HahaSound"+".ogg";  

       boolean exists = (new File(path)).exists();  
       if (!exists){new File(path).mkdirs();}  

       FileOutputStream save;  
       try {  
        save = new FileOutputStream(path+filename);  
        save.write(buffer);  
        save.flush();  
        save.close();  
       } catch (FileNotFoundException e) {  
        // TODO Auto-generated catch block  
        return false;  
       } catch (IOException e) {  
        // TODO Auto-generated catch block  
        return false;  
       }      

       sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://"+path+filename)));  

       File k = new File(path, filename);  

       ContentValues values = new ContentValues();  
       values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath());  
       values.put(MediaStore.MediaColumns.TITLE, "HahaSound");  
       values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/ogg");  
       values.put(MediaStore.Audio.Media.ARTIST, "cssounds ");  
       values.put(MediaStore.Audio.Media.IS_RINGTONE, true);  
       values.put(MediaStore.Audio.Media.IS_NOTIFICATION, false);  
       values.put(MediaStore.Audio.Media.IS_ALARM, true);  
       values.put(MediaStore.Audio.Media.IS_MUSIC, false);  

       //Insert it into the database  
       this.getContentResolver().insert(MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath()), values);  

       return true;  
      }  

   public boolean savenot(int ressound){  
       byte[] buffer=null;  
       InputStream fIn = getBaseContext().getResources().openRawResource(ressound);  
       int size=0;  

       try {  
        size = fIn.available();  
        buffer = new byte[size];  
        fIn.read(buffer);  
        fIn.close();  
       } catch (IOException e) {  
        // TODO Auto-generated catch block  
        return false;  
       }  

       String path="/sdcard/media/audio/notifications/";  
       String filename="HahaSound"+".ogg";  

       boolean exists = (new File(path)).exists();  
       if (!exists){new File(path).mkdirs();}  

       FileOutputStream save;  
       try {  
        save = new FileOutputStream(path+filename);  
        save.write(buffer);  
        save.flush();  
        save.close();  
       } catch (FileNotFoundException e) {  
        // TODO Auto-generated catch block  
        return false;  
       } catch (IOException e) {  
        // TODO Auto-generated catch block  
        return false;  
       }      

       sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://"+path+filename)));  

       File k = new File(path, filename);  

       ContentValues values = new ContentValues();  
       values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath());  
       values.put(MediaStore.MediaColumns.TITLE, "HahaSoundSound");  
       values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/ogg");  
       values.put(MediaStore.Audio.Media.ARTIST, "cssounds ");  
       values.put(MediaStore.Audio.Media.IS_RINGTONE, false);  
       values.put(MediaStore.Audio.Media.IS_NOTIFICATION, true);  
       values.put(MediaStore.Audio.Media.IS_ALARM, true);  
       values.put(MediaStore.Audio.Media.IS_MUSIC, false);  

       //Insert it into the database  
       this.getContentResolver().insert(MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath()), values);  

       return true;  
      }  
}

ОБНОВЛЕННЫЙ НАЧИНАЯ С ОТВЕТА STOLE -

//BUTTON 1

        View SoundButton1 = findViewById(R.id.Sound1);
        SoundButton1.setOnClickListener(this);

        View SoundButton2 = findViewById(R.id.Sound2);
        SoundButton2.setOnClickListener(this);
 }

            public void onClick(View v) {
                switch (v.getId()) {

                case R.id.Sound1:
        mSoundManager.playSound(1);
                break;

            case R.id.Sound2:
        mSoundManager.playSound(2);
                break;
                }

                Button SoundButton11 = (Button) findViewById(R.id.Sound1);  
                registerForContextMenu(SoundButton11);  

                Button SoundButton22 = (Button) findViewById(R.id.Sound2);  
                registerForContextMenu(SoundButton22);  
            }

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

    public boolean onContextItemSelected(MenuItem item) { 
        AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
        long SoundButton11 = info.id;
        switch (item.getItemId()) { 
    case MENU_RINGTONE:
        if (savering(R.raw.schwing)){  
            // Code if successful  
            Toast.makeText(this, "Saved as Ringtone", Toast.LENGTH_SHORT).show();
            }  
            else  
            {  
            // Code if unsuccessful  
            Toast.makeText(this, "Failed - Check your SDCard", Toast.LENGTH_SHORT).show();
            }
            break;
    case MENU_NOTIFICATION:
        if (savenot(R.raw.schwing)){  
            // Code if successful  
            Toast.makeText(this, "Saved as Notification", Toast.LENGTH_SHORT).show();
            }  
            else  
            {  
            // Code if unsuccessful  
            Toast.makeText(this, "Failed - Check your SDCard", Toast.LENGTH_SHORT).show();
            }
            break;
    }
        return false;


    } 

Это - то, что 've получил начиная с чтения Вашего последнего ответа. Я просто пытаюсь получить его работающий над первой кнопкой, прежде чем я попытаюсь перейти на следующее. Но с Вашим кодом я получаю предупреждение под SoundButton11 "Локальная переменная, SoundButton11 никогда не читается", я смущен, потому что я имею...

Button SoundButton11 = (Button) findViewById(R.id.Sound1);  
                    registerForContextMenu(SoundButton11); 

Я также попробовал Sound1, и это не работало также. Какие-либо предложения?

1
задан brybam 7 August 2010 в 03:51
поделиться

2 ответа

2 Вещи о вашем коде....

1) Нет функции onCreateContextMenu1, поэтому вы не переопределяете ее... Поэтому вызывается первая onCreateContextMenu.

2)

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

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

вот что вы должны делать...

final int MENU_RINGTONE = 0;
final int MENU_NOTIFICATION = 1;

public void onCreateContextMenu(ContextMenu menu, View v, 
            ContextMenuInfo menuInfo) { 
        super.onCreateContextMenu(menu, v, menuInfo);
        menu.add(0, MENU_RINGTONE, 0, "Ringtone"); 
        menu.add(0, MENU_NOTIFICATION, 0, "Notification"); 
} 

public boolean onContextItemSelected(MenuItem item) { 
        AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
        long buttonId = info.id;
        switch (item.getItemId()) { 
    case MENU_RINGTONE:
            function1(buttonId);
            break;
    case MENU_NOTIFICATION:
            function2(buttonId);
            break;
    }
}

Вам не нужны дополнительные function12,funtion11,function21,function22...вы можете обобщить их...но я оставляю это на ваше усмотрение.

2
ответ дан 2 September 2019 в 22:50
поделиться

Check the comments, i left below...

 public boolean onContextItemSelected(MenuItem item) { 
        AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
        long SoundButton11 = info.id; //THIS IS THE UNUSED VARIABLE!
        switch (item.getItemId()) { 
    case MENU_RINGTONE:
        if (savering(R.raw.schwing)){  //this should change based on what button was pressed...
            // Code if successful  
            Toast.makeText(this, "Saved as Ringtone", Toast.LENGTH_SHORT).show();
            }  
            else  
            {  
            // Code if unsuccessful  
            Toast.makeText(this, "Failed - Check your SDCard", Toast.LENGTH_SHORT).show();
            }
            break;
    case MENU_NOTIFICATION:
        if (savenot(R.raw.schwing)){  //this should change based on what button was pressed...
            // Code if successful  
            Toast.makeText(this, "Saved as Notification", Toast.LENGTH_SHORT).show();
            }  
            else  
            {  
            // Code if unsuccessful  
            Toast.makeText(this, "Failed - Check your SDCard", Toast.LENGTH_SHORT).show();
            }
            break;
    }
        return false;

    } 

I suppose this is something on the lines that you want... before you do this make sure SoundButton1(& 2) are Instance Variables so they can be accessible in all the functions of your Activity.

    //UNTESTED CODE!
    public boolean onContextItemSelected(MenuItem item) { 
            AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
            long SoundButton11 = info.id; //THIS IS THE UNUSED VARIABLE!
            int resId = (SoundButton11 == SoundButton1.getId() )? R.raw.schwing : R.raw.rolf;
            switch (item.getItemId()) { 
    case MENU_RINGTONE:
                if (savering(resId)){  //use resId instead...
                    // Code if successful  
                    Toast.makeText(this, "Saved as Ringtone", Toast.LENGTH_SHORT).show();
                    }  
                    else  
.....
0
ответ дан 2 September 2019 в 22:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: