4

プログラミングを始めたばかりで、最初のアプリをコーディングしています。私はこれについて十分長い間頭を悩ませてきました。これは、リスナーが ListFragment に実装され、イベント リスナーが ListFragment をホストする FragmentActivity にあるチュートリアルから取り上げました。例では次のようになっています (関連する部分のみを示しています)。

MyList クラス:

public class MyList extends ListFragment{

   OnSomeItemSelectedListener mCallback;

   public interface OnSomeItemSelectedListener {
      public void onSomeItemSelectedListener(int position, long id);
    }

   @Override
   public void onAttach(Activity activity) {
      super.onAttach(activity);
      // This makes sure that the container activity has implemented
      // the callback interface. If not, it throws an exception.
      try {
         mCallback = (OnSomeItemSelectedListener) activity;
      } catch (ClassCastException e) {
         throw new ClassCastException(activity.toString()
         + " must implement OnSomeItemSelectedListener");
      }
   }

   @Override
   public void onListItemClick(ListView l, View v, int position, long id) {
      super.onListItemClick(l, v, position, id);
      mCallback.onSomeItemSelectedListener(position, id);
   }
}

MainActivity クラス:

public class MainActivity extends FragmentActivity implements
        MyList.OnSomeItemSelectedListener{

    @Override
    public void onSomeItemSelectedListener(int position, long id) {
       //some stuff done here when clicked on a item from the listfragment
    }
}

上記は問題なく動作します。

これをアプリケーション クラスに実装して、AsyncTask が終了したときにイベント リスナー (FragmentActivity) に通知しようとしています。これは、アプリケーション クラスで行ったことです。

MyApplication クラス:

public class MyApplication extends Application {

    OnFetchCompleteListener mCallback;

    public interface OnFetchCompleteListener {
        public void onFetchCompleteListener();
    }

    public synchronized void fetchUpdates() {
        String[] mURLs = getURLs();
        new DownloadDataAsyncTask().execute(mURLs[0], mURLs[1]);
    }

    private class DownloadDataAsyncTask extends
            AsyncTask<String, Void, JSONObject[]> {

        @Override
        protected JSONObject[] doInBackground(String... params) {
            //Some stuff
            return mJSON;
        }

        @Override
        protected void onPostExecute(JSONObject[] result) {
            // Informing listeners on fetchData complete
            mCallback.onFetchCompleteListener();
        }
    }
}

mCallbackアプリケーション クラスでをインスタンス化するにはどうすればよいですか? これがなければ、

   mCallback = (OnSomeItemSelectedListener) activity;

アプリケーション クラスからヌル ポインター例外が発生します。

どうもありがとう

4

1 に答える 1

4

アプリケーションからではなく、アクティビティから mCallback をインスタンス化できると思います。

アクティビティの onCreate() または onResume() メソッドで、次のように記述できます。

MyApplication myApplication = getApplication();
myApplicaton.mCallback = this;

ただし、アクティビティが OnFetchCompleteListener を実装していることを確認してください (コードの最後の部分で OnSomeItemSelectedListener と入力した理由はわかりません)。

于 2013-03-29T11:43:22.733 に答える