如何从java类(不是活动,没有布局)调用方法到活动?

时间:2016-07-11 09:39:33

标签: java android android-intent listactivity

我不能使用意图,原因如下所述。此外,我尝试调用该方法,但它正在抛出NullPointerException

我要做的是将songName中的字符串ListActivity发送到具有方法getSongIndex()的类,该方法比较传入的字符串(songName )到ArrayList中的歌曲,然后将索引(整数)返回给调用活动。

我无法使用意图的原因: 如果我将ListActivity's onClickListener的意图发送到java类,则接收方的getIntent.getExtras()会导致错误。另外,我需要在java类中另一个意图将songIndex发送回ListActivity

以下是必需的代码:

  

这是java类中的函数: SongsManager.java 这是   我如何在方法中获得songName并将其与歌曲中的歌曲进行比较   电话:

  public int songIndex;
ArrayList<String> songs = new ArrayList<String>();
public int getSongIndex(String s, Context c) {
    String songName = s;
    String songTitle;
    String song;
    final Cursor mCursor = c.getContentResolver().query(
            MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
            new String[]{MediaStore.Audio.Media.TITLE}, null, null,
            "LOWER(" + MediaStore.Audio.Media.TITLE + ") ASC");
    /* run through all the columns we got back and save the data we need into the arraylist for our listview*/
    if (mCursor.moveToFirst()) {
        do {
            song = MediaStore.Audio.Media.TITLE;//mCursor.getString(mCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
            songs.add(song);

        } while (mCursor.moveToNext());

    }
    String tempSong;
    for(int i=0; i <songs.size();i++) {
        tempSong = songs.get(i);
        if(songName.equalsIgnoreCase(tempSong))
        {
            songIndex = i;
        }

    }

    mCursor.close(); //cursor has been consumed so close it
    return songIndex;
}

这是我在ListActivity中实例化SongsManager对象的方法: public SongsManager manager = new SongsManager();

这是ListActivity的onClickListener中调用函数getSongIndex的代码。

lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                                    int position, long id) {

                TextView textView = (TextView) view.findViewById(android.R.id.text1);
                String songName = textView.getText().toString();
                songIndex = manager.getSongIndex(songName);
                // Starting new intent
                Intent i = new Intent(getApplicationContext(),MusicPlayerActivity.class);
                Log.d("TAG", "onItemClick");
                //// Sending songIndex to PlayerActivity
                i.putExtra("songIndex", songIndex);
                startActivity(i);

            }
        });

我正在寻找解决或解决此问题的方法。有没有办法使用意图来解决这个问题(请注意,我的ListActivity已经收到了来自其onCreate()中另一个活动的意图)。我读到了有关BroadcastReciever的内容,但它看起来真的很麻烦。任何其他简单的方法将受到高度赞赏。 谢谢

1 个答案:

答案 0 :(得分:2)

问题是:

final Cursor mCursor = getApplicationContext().getContentResolver().query(...

线。

因为SongsManager是普通的java类,那么getApplicationContext()方法如何在其中访问?

表示活动或任何其他组件在SongsManager类中扩展但未在AndroidManifest.xml中注册

因此,要解决此问题,请删除已在SongsManager中扩展的类,并使用getSongIndex方法传递上下文以访问getContentResolver()。例如:

public int getSongIndex(String s,Context mContext) {
     String songName = s;
     String songTitle;
     final Cursor mCursor = mContext.getContentResolver().query(...);
     ...
  return songIndex;
}

并将getSongIndex方法称为:

songIndex = manager.getSongIndex(songName,getApplicationContext());