【问题标题】:Android: Learning about Arrays. Need a little helpAndroid:学习数组。需要一点帮助
【发布时间】:2011-06-28 04:02:31
【问题描述】:

所以我很接近我的代码。两天来,我一直试图让我的 Soundboard 使用 Set As Ringtone。很明显我需要使用数组。

三段代码,但不太清楚如何实现。

1:数组声明:

int [] buttonArray = {R.id.button1, R.raw.button2};

2:for 语句(错误 - 我不确定)

for (int i=0; i<buttonArray.length; i++){  
      buttonArray[i];  
      }

3:按钮开关:(错误 - 我也知道这也是错误的)

public void onClick(View v) {

    switch (v.getId()) {
    case buttonArray[i]:

@Ted - 好的,下面是我的完整代码。音板部分效果很好,设置为铃声不起作用。我知道为什么。我正在使用 R.raw.iightsong 的功能。我想我需要一个数组,以便区分声音。更不用说我会有 10 个按钮,所以我会有很多代码。我想通过使用数组来消除很多代码。

package com.hawkaddictsoundboard;



import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import android.app.Activity;
import android.content.ContentValues;
import android.content.Intent;
import android.media.MediaPlayer;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class HawkeyeAddictSoundboardActivity extends Activity implements OnClickListener {
    /** Called when the activity is first created. */
    Button fightsong;
    Button oniowa;

    MediaPlayer mMediaPlayer;

    int[] soundArray = {R.raw.ifightsong,R.raw.oniowa}; // etc...


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


        fightsong = (Button) findViewById(R.id.fightsong_button);
        fightsong.setOnClickListener(this);
        oniowa = (Button) findViewById(R.id.oniowa_button);
        oniowa.setOnClickListener(this);
        registerForContextMenu(fightsong);  
        registerForContextMenu(oniowa); 
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.fightsong_button:
               if (mMediaPlayer!=null && mMediaPlayer.isPlaying()) {
                   mMediaPlayer.stop();
                   mMediaPlayer.reset();
                   mMediaPlayer.start();

                    }
               else{
                    if (mMediaPlayer!=null){
                        mMediaPlayer.reset();
                        mMediaPlayer.release();
                }
                    mMediaPlayer = MediaPlayer.create(getBaseContext(), R.raw.ifightsong);
                    mMediaPlayer.start();
        // TODO Auto-generated method stub
         }
               break;
        case R.id.oniowa_button:
               if (mMediaPlayer!=null && mMediaPlayer.isPlaying()) {
                   mMediaPlayer.stop();
                   mMediaPlayer.reset();
                   mMediaPlayer.start();

               }
               else{
                    if (mMediaPlayer!=null){
                        mMediaPlayer.reset();
                        mMediaPlayer.release();
                }
                    mMediaPlayer = MediaPlayer.create(getBaseContext(), R.raw.oniowa);
                    mMediaPlayer.start();
        // TODO Auto-generated method stub
         }
               break;
    }}
     @Override
     public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {
     super.onCreateContextMenu(menu, v, menuInfo);
     menu.setHeaderTitle("Set As...");
     menu.add(0, v.getId(), 0, "Ringtone");
     menu.add(0, v.getId(), 0, "Notification");
     }

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

     public void function1(int id){ 
         if (saveringifightsong(R.raw.ifightsong)){  
             // 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 (savenotifightsong(R.raw.ifightsong)){  
             // 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 saveringifightsong(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="ifightsong_ring"+".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, "Iowa Fight Song");  
           values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/ogg");  
           values.put(MediaStore.Audio.Media.ARTIST, "Hawkeye Sounds ");  
           values.put(MediaStore.Audio.Media.IS_RINGTONE, true);  
           values.put(MediaStore.Audio.Media.IS_NOTIFICATION, false);  
           values.put(MediaStore.Audio.Media.IS_ALARM, false);  
           values.put(MediaStore.Audio.Media.IS_MUSIC, false);  

           //Insert it into the database  
            Uri uri = MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath());

            getContentResolver().delete(uri, MediaStore.MediaColumns.DATA + "=\"" + k.getAbsolutePath() + "\"", null);

            Uri newUri = getContentResolver().insert(uri, values);

            RingtoneManager.setActualDefaultRingtoneUri(
                    HawkeyeAddictSoundboardActivity.this,
              RingtoneManager.TYPE_RINGTONE,
              newUri
            );
            return true;  
          }   
     public boolean savenotifightsong(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="ifightsong_not"+".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, "Iowa Fight Song");  
           values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/ogg");  
           values.put(MediaStore.Audio.Media.ARTIST, "Hawkeye Sounds ");  
           values.put(MediaStore.Audio.Media.IS_RINGTONE, false);  
           values.put(MediaStore.Audio.Media.IS_NOTIFICATION, true);  
           values.put(MediaStore.Audio.Media.IS_ALARM, false);  
           values.put(MediaStore.Audio.Media.IS_MUSIC, false);  

           //Insert it into the database  
            Uri uri = MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath());

            getContentResolver().delete(uri, MediaStore.MediaColumns.DATA + "=\"" + k.getAbsolutePath() + "\"", null);

            Uri newUri = getContentResolver().insert(uri, values);

            RingtoneManager.setActualDefaultRingtoneUri(
                    HawkeyeAddictSoundboardActivity.this,
              RingtoneManager.TYPE_NOTIFICATION,
              newUri
            );
            return true;  
          }
     public boolean saveringoniowa(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="oniowa_ring"+".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, "On Iowa");  
           values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/ogg");  
           values.put(MediaStore.Audio.Media.ARTIST, "Hawkeye Sounds ");  
           values.put(MediaStore.Audio.Media.IS_RINGTONE, true);  
           values.put(MediaStore.Audio.Media.IS_NOTIFICATION, false);  
           values.put(MediaStore.Audio.Media.IS_ALARM, false);  
           values.put(MediaStore.Audio.Media.IS_MUSIC, false);  

           //Insert it into the database  
            Uri uri = MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath());

            getContentResolver().delete(uri, MediaStore.MediaColumns.DATA + "=\"" + k.getAbsolutePath() + "\"", null);

            Uri newUri = getContentResolver().insert(uri, values);

            RingtoneManager.setActualDefaultRingtoneUri(
                    HawkeyeAddictSoundboardActivity.this,
              RingtoneManager.TYPE_RINGTONE,
              newUri
            );
            return true;  
          }
     public boolean savenotoniowa(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="oniowa_not"+".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, "On Iowa");  
           values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/ogg");  
           values.put(MediaStore.Audio.Media.ARTIST, "Hawkeye Sounds ");  
           values.put(MediaStore.Audio.Media.IS_RINGTONE, false);  
           values.put(MediaStore.Audio.Media.IS_NOTIFICATION, true);  
           values.put(MediaStore.Audio.Media.IS_ALARM, false);  
           values.put(MediaStore.Audio.Media.IS_MUSIC, false);  

           //Insert it into the database  
            Uri uri = MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath());

            getContentResolver().delete(uri, MediaStore.MediaColumns.DATA + "=\"" + k.getAbsolutePath() + "\"", null);

            Uri newUri = getContentResolver().insert(uri, values);

            RingtoneManager.setActualDefaultRingtoneUri(
                    HawkeyeAddictSoundboardActivity.this,
              RingtoneManager.TYPE_NOTIFICATION,
              newUri
            );
            return true;  
          }

}

编辑 请查看我的 getTag 以获取下面的上下文菜单。问题是,我要关闭 Ted 了吗?

public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {
                    int tag;
                    try {
                        tag = Integer.parseInt((String) v.getTag());
                    } catch (Exception ex) {
                        // null or invalid tag -- how'd that happen?
                        return;
                    }
     super.onCreateContextMenu(menu, v, menuInfo);
     menu.setHeaderTitle("Set As...");
     menu.add(0, soundArray[tag], 0, "Ringtone");
     menu.add(0, soundArray[tag], 0, "Notification");
     }

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


     public void function1(int tag){ 
             if (savering(soundArray[tag])){  
             // 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 tag){  

         if (savenot(soundArray[tag])){  
             // 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();
             }}

【问题讨论】:

    标签: android arrays


    【解决方案1】:

    这段代码没有意义。本声明:

    int [] = {R.raw.sound1, R.raw.sound2};
    

    不是合法的 Java——没有变量名。

    for 循环的主体不是语句(它不做任何事情),所以这也不合法。

    case 值需要是编译时间 常量。您不能使用case 在不同的运行时值中进行选择。您必须像这样重新执行switch:

    int id = v.getId();
    for (int button : buttonArray) {
        if (id == button) {
            // got a hit -- process it
            break; // then end the for loop
        }
    }
    

    编辑

    好的,我想我明白你要做什么了。当我做这种事情时,我发现使用android:tag 属性很有用;它比您尝试做的要方便得多。您可以在布局中设置标签或在代码中进行。这是一个在代码中执行此操作的方法。

    int[] soundArray = { /* ... */ };
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    
    
        fightsong = (Button) findViewById(R.id.fightsong_button);
        fightsong.setOnClickListener(this);
        fightSong.setTag("0");
        oniowa = (Button) findViewById(R.id.oniowa_button);
        oniowa.setOnClickListener(this);
        oniowa.setTag("1");
        registerForContextMenu(fightsong);  
        registerForContextMenu(oniowa); 
    }
    
    @Override
    public void onClick(View v) {
        int tag;
        try {
            tag = Integer.parseInt(v.getTag());
        } catch (Exception ex) {
            // null or invalid tag -- how'd that happen?
            return;
        }
        // clear out old media player (if any)
        if (mMediaPlayer != null) {
            if (mMediaPlayer.isPlaying()) {
                mMediaPlayer.stop();
            }
            mMediaPlayer.release();
        }
        // fire up a media player with the correct sound
        mMediaPlayer = MediaPlayer.create(this, soundArray[tag]);
        mMediaPlayer.start();
    }
    

    您也可以在创建上下文菜单时使用标签而不是视图 ID。

    【讨论】:

    • 对不起,应该是 int[] buttonArray =
    • 请看我的编辑 Ted。现在应该更有意义了。但是,您实际上在哪里识别 buttonArray[0] 和 [1]?
    • 也许你可以解释更多关于你想要完成的事情。另外,为什么需要使用数组是“显而易见的”?
    • @Ted - 好的,我已经添加了所有代码。如果您有比数组更好的建议,我会全力以赴。
    • @tjberte - 我已附加到我的答案中。
    【解决方案2】:

    该问题的示例解决方案如下 关于您在 swicth 案例中的代码块

    you are repeating the information regarding mMediaPlayer in each case which is increasing your code. 
    
    switch (v.getId()) {
            case R.id.fightsong_button:
                   if (mMediaPlayer!=null && mMediaPlayer.isPlaying()) {
                       mMediaPlayer.stop();
                       mMediaPlayer.reset();
                       mMediaPlayer.start();
    
                        }
                   else{
                        if (mMediaPlayer!=null){
                            mMediaPlayer.reset();
                            mMediaPlayer.release();
                    }
                        mMediaPlayer = MediaPlayer.create(getBaseContext(), R.raw.ifightsong);
                        mMediaPlayer.start();
            // TODO Auto-generated method stub
             }
                   break;
            case R.id.oniowa_button:
                   if (mMediaPlayer!=null && mMediaPlayer.isPlaying()) {
                       mMediaPlayer.stop();
                       mMediaPlayer.reset();
                       mMediaPlayer.start();
    
                   }
                   else{
                        if (mMediaPlayer!=null){
                            mMediaPlayer.reset();
                            mMediaPlayer.release();
                    }
                        mMediaPlayer = MediaPlayer.create(getBaseContext(), R.raw.oniowa);
                        mMediaPlayer.start();
            // TODO Auto-generated method stub
             }
                   break;
        }}
    

    此外,为了减少代码行而不是 swith case,您可以使用 if else 以更少的代码实现相同的功能。

    【讨论】:

    • 我没有看到您所做的任何更改?这部分看起来和我的一样。
    • 1. 减少代码行而不是 swith case,您可以使用 if else 来实现相同 2. 在每种情况下,您都在重复有关 mMediaPlayer 的信息,这会增加您的代码。希望这会有所帮助
    • 好的,解决了问题,但我最大的问题是试图让底部部分正常工作(铃声)。我需要一个数组,以便当我单击一个按钮时,它对应于正确的声音,然后为其分配正确的铃声。现在在上面的代码中,它只会将 R.raw.iightsong 指定为铃声或通知。我需要一个数组来将函数 1 和 2 连接到不同的声音。
    • hmm... 如果我得到它正确使用数组 int []arr = new int[]{R.raw.one,R.raw.2};然后代替 switch case 使用你的数组 if else ... for(i=0;i
    • 您没有查看我的所有代码。我需要几个不同的数组。对于按钮和 raw(s)。但就像我说的,看看铃声设置再往下看。这就是我需要帮助的地方。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多