2013-03-15 12 views
10

ファイルが正常にダウンロードされた場合、フラグメント内のリストビューを更新する必要があります。だから私のダウンロードマネージャのBroadcastReceiverで、私は、この新しい放送受信機を登録します。その後、ブロードキャストレシーバーのフラグメントのリストビューを更新する

IntentFilter filter = new IntentFilter("CONTENTS_NOTIFICATION"); 
getActivity().getApplicationContext().registerReceiver(myReceiver, filter); 

Intent intent = new Intent(); 
intent.setAction("CONTENTS_NOTIFICATION"); 
context.sendBroadcast(intent); 

そして、私は受信機を登録するために、次のコードを追加しますonCreateViewの私のフラグメントで

private BroadcastReceiver myReceiver = new BroadcastReceiver() { 

     @Override 
     public void onReceive(Context context, Intent intent) { 

      SQLiteDatabase db = DatabaseManager.getInstance(getActivity()).getWritableDatabase(); 
       c = SelectedExperience.getSelectedExperiences(db); 

       String id_esperienza = "Selected Experience"; 

       if (c.getCount() != 0) { 
        id_esperienza = c.getString(c.getColumnIndex(SelectedExperience.ID_ESPERIENZA)); 
       } 

      populateListview(v, id_esperienza); 

     } 
    }; 

と終わり:

public void onDestroyView() { 
     super.onDestroyView(); 
     getActivity().getApplicationContext().unregisterReceiver(myReceiver); 
} 

2つの異なるFragment用に2つの放送受信機を追加する必要があります。最初の1つでは、すべて正常に動作します。アプリケーションでは、ユーザーがフラグメント上にある場合は更新され、2番目のフラグメントでは次のエラーが発生します。

03-15 07:32:40.474: E/AndroidRuntime(1692): FATAL EXCEPTION: main 
03-15 07:32:40.474: E/AndroidRuntime(1692): java.lang.RuntimeException: Error receiving broadcast Intent { act=CONTENTS_NOTIFICATION flg=0x10 } in [email protected] 
03-15 07:32:40.474: E/AndroidRuntime(1692):  at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:768) 
03-15 07:32:40.474: E/AndroidRuntime(1692):  at android.os.Handler.handleCallback(Handler.java:725) 
03-15 07:32:40.474: E/AndroidRuntime(1692):  at android.os.Handler.dispatchMessage(Handler.java:92) 
03-15 07:32:40.474: E/AndroidRuntime(1692):  at android.os.Looper.loop(Looper.java:137) 
03-15 07:32:40.474: E/AndroidRuntime(1692):  at android.app.ActivityThread.main(ActivityThread.java:5191) 
03-15 07:32:40.474: E/AndroidRuntime(1692):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-15 07:32:40.474: E/AndroidRuntime(1692):  at java.lang.reflect.Method.invoke(Method.java:511) 
03-15 07:32:40.474: E/AndroidRuntime(1692):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795) 
03-15 07:32:40.474: E/AndroidRuntime(1692):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562) 
03-15 07:32:40.474: E/AndroidRuntime(1692):  at dalvik.system.NativeStart.main(Native Method) 
03-15 07:32:40.474: E/AndroidRuntime(1692): Caused by: java.lang.NullPointerException 
03-15 07:32:40.474: E/AndroidRuntime(1692):  at sample.actionscontentview.fragment.ContentsFragment.populateListview(ContentsFragment.java:194) 
03-15 07:32:40.474: E/AndroidRuntime(1692):  at sample.actionscontentview.fragment.ContentsFragment.access$0(ContentsFragment.java:111) 
03-15 07:32:40.474: E/AndroidRuntime(1692):  at sample.actionscontentview.fragment.ContentsFragment$1.onReceive(ContentsFragment.java:107) 
03-15 07:32:40.474: E/AndroidRuntime(1692):  at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:758) 
03-15 07:32:40.474: E/AndroidRuntime(1692):  ... 9 more 

とコードは同じです!なぜ私はそれが機能していない得ることができません。 populatelistViewに問題があると言われていますが、ブロードキャスト受信機から呼び出されなければ同じ機能がフラグメント内で正常に機能します。

私はこの2つの断片の間で考えることができる唯一の違いは、更新プログラムが動作するのは、アプリケーションの起動時に最初に開かれたものであるということです。

+1

行番号は何ですか? 194とpopulateListViewのコードを投稿する – Atrix1987

+0

私の悪い...エラーpopulatelistViewで、特に私は間違ったビューを渡していた!だから、コードは正常に動作します! – phcaze

答えて

4

はGreenRobotでEventBusを使用してみてくださいhttps://github.com/greenrobot/EventBus

あなたのファイルが正常に使用すると、イベント

EventBus.getDefault().post(YourData.Downloaded); 
を投稿ダウンロードすると あなたのフラグメントは、好ましくONSTARTで、イベントを受信するために登録されます

()メソッド

EventBus.getDefault().register(this); 

そして、それはonEventメソッドでイベントを受け取ります:

public void onEvent(Data.State) {} 

あなたのリストビューを簡単に更新することができます。また、onStop()メソッドでイベントを受け取ることを登録解除します。データをアプリケーションに保存したり、保存することができます。それは非常に簡単で素晴らしいソリューションです。それが役に立てば幸い。このイベントに必要な数だけフラグメントを登録することができます。イベントバスがイベントを通知すると、登録されたすべてのフラグメントがこのイベントを受信します。

0

は、私は、これは古いですが、知っている場合には、あなたは私の問題で行ってくださいよりも、自分の経験から私を助けることができます:私はここに同様の質問を掲載している

Broadcast receivers and Fragments。あなたは私がやった回避策を探すことができますが、これを行うためのより良い方法があるはずです。

一部の人は、すべてのブロードキャストがフラグメントをホストしているアクティビティに移動し、リスナを介して受信した内容に基づいてビューを更新する必要があることをフラグメントに伝えることを提案しています。これはより良いアプローチかもしれませんが、フラグメントのビューのためのヌルポインタのチェックも必要です。

関連する問題