0

ご覧のとおり、あちこちで見つけたコードのスニペットを切り刻んで変更してきましたが、それには何年もかかりました!

アイテムが選択されたときにタッチ選択をキャプチャしないコンテキストメニューに固執しています.Eclipseは修正方法がわからないエラーを表示しています.

メインスレッドで配列リストを参照する方法がわかりません。それが文字列からの配列である場合の方法は知っていますが、メインスレッドではありません。

*が付いている行は、エラーが発生する行です。

誰かがそれをのぞき見できるかどうか疑問に思っていますか?

import java.util.ArrayList;
import android.app.ListActivity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.ListView;
import android.widget.Toast;
public class MainActivity extends ListActivity {
private ArrayList<Sound> mSounds = null;
private SoundAdapter mAdapter = null;
static MediaPlayer mMediaPlayer = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
registerForContextMenu(getListView());
this.getListView().setSelector(R.drawable.selector);
mSounds = new ArrayList<Sound>();
mSounds.add(s);
s = new Sound();
s.setDescription("Echoex");
s.setSoundResourceId(R.raw.echoex);
mSounds.add(s);
s = new Sound();
s.setDescription("Edge");
s.setSoundResourceId(R.raw.edge);
mSounds.add(s);
s = new Sound();
s.setDescription("Enterprise");
s.setSoundResourceId(R.raw.enterprise);
mSounds.add(s);
s = new Sound();
s.setDescription("Envy");
s.setSoundResourceId(R.raw.envy);
mSounds.add(s);
s = new Sound();
s.setDescription("Etcher");
s.setSoundResourceId(R.raw.etcher);
mSounds.add(s);
mAdapter = new SoundAdapter(this, R.layout.list_row, mSounds);
setListAdapter(mAdapter);
}
@Override
public void onListItemClick(ListView parent, View v, int position, long id){
Sound s = (Sound) mSounds.get(position);
MediaPlayer mp = MediaPlayer.create(this, s.getSoundResourceId());
mp.start();

}@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.context_menu, menu);
  }
@Override
public boolean onContextItemSelected(MenuItem item) {
    AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
    ********String[] names = getResources().getString(R.array.mSounds);
    switch(item.getItemId()) {
    case R.id.setasnotification:
          Toast.makeText(this, "Applying " + getResources().getString(R.string.setas) +
                      " context menu option for " + names[(int)info.id],
                      Toast.LENGTH_SHORT).show();
          return true;
    default:
          return super.onContextItemSelected(item);
    }
}}

Sound.java:

public class Sound {
private String mDescription = "";
private int mSoundResourceId = -1;
private int mIconResourceId = -1;
public void setDescription(String description) { mDescription = description; }
public String getDescription() { return mDescription; }
public void setSoundResourceId(int id) { mSoundResourceId = id; }
public int getSoundResourceId() { return mSoundResourceId; }
public void setIconResourceId(int id) { mIconResourceId = id; }
public int getIconResourceId() { return mIconResourceId; }
}
4

3 に答える 3

1

使用する必要があります

String[] names = getResources().getStringArray(R.array.names);

それ以外の

********String[] names = getResources().getString(R.array.names);
于 2013-08-10T08:44:40.920 に答える
0

変化する

 ********String[] names = getResources().getString(R.array.names);

 String[] names = getResources().getString(R.array.names);

ArrayList mSoundまた、インスタンス化せずにオブジェクトを追加していますmSound。次のようにする必要があります。

@Override
public void onCreate(Bundle savedInstanceState) {

.....

    mSound = new ArrayList<Sound>();

それからする

   mSound.add(s);

}
于 2013-08-10T08:49:58.473 に答える
0

ターゲット パラメータが正しくない可能性があります。

********String[] names = getResources().getString(R.array.mSounds);

タイプのmSoundをターゲットにしているように感じますArrayList<Sound>。この方法では、この方法は機能しません。上記の方法を使用する場合は、XML ファイルを作成する必要があります。以下に例を示します。

<?xml version="1.0" encoding="utf-8"?>  
<resources>  
    <array name="myArray">  
        <item>first song</item>  
        <item>second song</item>  
        <item>third song</item>  
        <item>fourth song</item>  
        <item>fifth song</item>  
    </array>
</resources>

これは、 soundArray.xmlの下の XML ファイルに保存されます。次に、上記の方法を次のように使用できます

String[] names = getResources().getStringArray(R.array.soundArray);

これはうまくいくはずです。

または、Sound オブジェクトを使用する場合

(Android クラスではありませんか?) リストをループして、上記のサウンド オブジェクトの文字列を返す必要があります。

int length = mSounds.size(); // get the length of mSounds object
String[] names = new String[length]; // creates a fixed array with strings
for(int i = 0; i < length; i++) {
     // add sound name to string array
     names[i] = mSounds.get(i).getDescription(); // returns the string name
}

しかし、Soundクラスがカスタム クラスである場合は、そのサウンド アイテムの名前を返すメソッドが含まれているかどうかを確認する必要があります。そうでない場合(またはtoString()メソッドを上書きしていない場合)、参照アドレスを返しますが、これは見たくないものです...

于 2013-08-10T09:17:16.113 に答える