Android: проблема с использованием нескольких контекстных меню - PullRequest
1 голос
/ 23 июля 2010

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

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

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

Может ли кто-нибудь пролить свет на то, почему второе контекстное менюне работает должным образом?

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;  
      }  
}

ОБНОВЛЕНО ОТВЕТ С СТУЛА -

//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;


    } 

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

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

Я также попробовал Sound1, и это тоже не сработало,Есть предложения?

Ответы [ 2 ]

2 голосов
/ 23 июля 2010

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

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

2)

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

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

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

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;
    }
}

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

0 голосов
/ 07 августа 2010

Проверьте комментарии, я оставил ниже ...

 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;

    } 

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

    //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  
.....
...