2017-10-24 11 views
0

私はdialogPragmentをonPostExecuteから起動しようとしていますが、何らかの理由でsupportFragmentManagerがnullを返します。私は主なアクティビティや他のフラグメントからdialogFragmentを起動しようとしましたが、それは完全に動作しますが、AsyncTaskから起動することはできません。ここでAsyncTaskは次のとおりです。 - ここにSupportfragmentManagerはnullになりますandroid kotlin

class SubscribeTask: AsyncTask<Void, Void, Void> { 
    var mContext: Context 
    var mTextView_temp: TextView 
    var mTextView_humidity: TextView 
    var mWeather_image: ImageView 
    var mMessage: JsonObject 
    var mResult = JsonObject() 
    var mTemp: String = "" 
    var mHumidity: String = "" 
    var mLdr: Boolean = true 
    var mRain: Boolean = false 
    var mWeather: Int = 0 
    var tester: Boolean = false 
    var mFire: Boolean = false 

    constructor(context: Context, textView_temp: TextView, textView_humidity: TextView, weather_image: ImageView, message: PNMessageResult){ 
     mContext = context 
     mMessage = message.message.asJsonObject 
     mTextView_temp = textView_temp 
     mTextView_humidity = textView_humidity 
     mWeather_image = weather_image 
    } 

    override fun doInBackground(vararg p0: Void?): Void? { 
     if (mMessage.has("pi")){ 
      mResult = mMessage.getAsJsonObject("pi") 
      mTemp = mResult.get("temp").asString 
      mHumidity = mResult.get("humidity").asString 
      mLdr = mResult.get("ldr").asBoolean 
      mRain = mResult.get("rain").asBoolean 
      mFire = mResult.get("fire").asBoolean 
      tester = true 
      if(mRain){ 
       mWeather = R.drawable.rainy 
      }else if(mLdr){ 
       mWeather = R.drawable.suny 
      }else{ 
       mWeather = R.drawable.cloudyy 
      } 
     } 
     return null 
    } 

    override fun onPostExecute(result: Void?) { 
     if(tester) { 
      mTextView_temp.text = mTemp 
      mTextView_humidity.text = mHumidity 
      mWeather_image.setImageResource(mWeather) 
      if(mFire){ 
       MainActivity().showAlertDialog("Fire", "There might be a fire in the house", R.drawable.house_fire, "Stop Alarm") 
      } 
     } 
    } 

} 

はshowAlertDialog()関数である: - ここに

fun showAlertDialog(title: String, content: String, imageid: Int, button: String){ 
     val fm = supportFragmentManager 
     val alertDialogFragment = AlertFragment(title, content, imageid, button).newInstance(title, content, imageid, button) 
     alertDialogFragment.show(fm, "fragment_alert") 
    } 

はdialogFragmentです: -

class AlertFragment(val mTitle: String, val mContent: String, val mImageId: Int, val mButton: String) : DialogFragment() { 

    fun newInstance(title: String, content: String, imageid: Int, button: String): AlertFragment { 
     val alertfrag = AlertFragment(title, content, imageid, button) 
     val args = Bundle() 
     args.putString("title", title) 
     alertfrag.arguments = args 
     return alertfrag 
    } 

    override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, 
           savedInstanceState: Bundle?): View? { 
     // Inflate the layout for this fragment 
     return inflater!!.inflate(R.layout.fragment_alert, container, false) 
    } 

    override fun onViewCreated(view: View?, savedInstanceState: Bundle?) { 
     super.onViewCreated(view, savedInstanceState) 
     title.text = mTitle 
     alertContent.text = mContent 
     alertImageId.setImageResource(mImageId) 
     alertButton.text = mButton 
    } 
} 

誰かが私を助けてください。 Javaの回答も大丈夫です。次のコードを持っているあなたのpostExecute機能で

答えて

0

これにオブザーバーパターンを使用できます。

その

interface myExecListener { 
fun onFinish(title: String, content: String, imageid: Int, button: 
String) 
} 

だから私は何をすべきSubscribeTask

class SubscribeTask: AsyncTask<Void, Void, Void>() { 
var listener: myExecListener? = null 

    fun exec(listener: myExecListener){ 
    this.listener = listener 
    this.execute() 
    } 

    override fun doInBackground(vararg params: Void?): Void? { 


    return null 
    } 

    override fun onPostExecute(result: Void?) { 
    super.onPostExecute(result) 
    listener?.onFinish("Fire", "There might be a fire in the house", 333, "Stop Alarm") 
    } 
} 

にこの行を追加します。そして、あなたの活動に

SubscribeTask().exec(object : myExecListener{ 
    override fun onFinish(title: String, content: String, imageid: Int, button: String) { 
    println("Observer triggered") 
    showAlertDialog(title, content, imageid, button) 
    } 
}) 
1

MainActivity().showAlertDialog(...) 

このは何をすべきか確かではありません新しいアクティビティオブジェクトを作成します。そのオブジェクトは新しく作成され、アンドロイドによって適切に初期化されないため、supportFragmentManagerのような内部オブジェクトは初期化されず、結果としてnullが表示されます。

+0

を実行するようなインターフェイスを作成しますか? –

+0

一般に、親アクティビティーの 'WeakReference'を' AsyncTask'に格納し、アクティビティーで何かを呼び出す必要がある場合は、 'postExecute'でその参照にアクセスします。 – Kiskae

+0

どのような例やコードを与えることができます私はnoobです –

関連する問題