1

首先抱歉,如果這篇文章看起來可能是重複的,但我對Android編程非常新,只有當我仍然無法獲得使用getActivity的滿意答案時才發佈此問題。使用getActivity

理論上我明白在這裏的幾個帖子中使用getActivity(),但我很困惑它是如何在我的代碼中工作的。

我有一個MainActivity類,我從中創建一個對話框onclick複選框。 我有另一個類TaxDialog實現對話框。點擊是/否按鈕,我在MainActivity類中調用方法定義。 下面是代碼:

MainActivty

import android.annotation.SuppressLint; 
import android.os.Bundle; 
import android.support.v4.app.DialogFragment; 
import android.support.v7.app.ActionBarActivity; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.Button; 
import android.widget.CheckBox; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.widget.Toast; 



public class MainActivity extends ActionBarActivity implements View.OnClickListener, View.OnFocusChangeListener { 

// onCheck of checkbox showNoticeDialog is called 

    public void showNoticeDialog() { 
     // Create an instance of the dialog fragment and show it 
     Log.i("MyActivity", "Inside showNoticeDialog"); 
     DialogFragment dialog = new TaxDialog(); 
     Bundle args = new Bundle(); 
     args.putString("title", "Test"); 
     args.putString("message", "Test Message"); 
     dialog.setArguments(args); 

     dialog.show(getSupportFragmentManager(), "dialog"); 


    } 
    public void doPositiveClick(){ 
     Log.i("MyActivity", "Inside +ve"); 
    } 
    public void doNegativeClick(){ 
     Log.i("MyActivity", "Inside -ve"); 
    } 

} 

TaxDialog

import android.app.Activity; 
import android.app.AlertDialog; 
import android.app.Dialog; 
import android.content.DialogInterface; 
import android.os.Bundle; 
import android.support.v4.app.DialogFragment; 
import android.util.Log; 

public class TaxDialog extends DialogFragment { 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     Bundle args = getArguments(); 

     String title = args.getString("title"); 

     String message = args.getString("message"); 
     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
     builder.setTitle(title); 

     builder.setMessage(message); 
     builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       //getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, null); 
       Log.i("MyActivity", "Expected fault area."); 
       ((MainActivity) getActivity()).doPositiveClick(); 
      } 
     }); 
     builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       ((MainActivity) getActivity()).doNegativeClick(); 
      } 
     }); 
     builder.create(); 

     return builder.create(); 
    } 

} 

在這裏,我想了解以下額度的運作

((MainActivity) getActivity()).doPositiveClick(); 

,也請讓我意識到做同樣事情的其他方式(像MainActivity.this.getActivity(或其他))。

非常感謝。

編輯

謝謝大家。可能我錯誤地構思了這個問題。我唯一的疑問是getActivity()如何返回Activity引用。現在我明白了。

+0

當您使用片段時,它只是獲取上下文的唯一方法。如上所述,您正在使用'DialogFragment'並在'OnClickListener'中需要上下文。 –

+2

最好的建議,我很抱歉會很粗魯,會得到一個好的Java書,並在跳入Android之前閱讀它,無論如何只是爲了回答你的問題,該行代碼通過調用getActivity獲取活動的引用,將其轉換爲MainActivity並調用它的doPositive方法... –

回答

4

允許其拆分:

  • getActivity()可以在片段被用於獲得Fragment(所顯示的片段基本上活動)的父Activity

  • ((MainActivity) getActivity())此外還將getActivity()的結果轉換爲MainActivity。通常,您只知道getActivity()返回Activity類型的對象,但使用此轉換爲,您告訴編譯器您確定該對象是Activity的一個特定子類,即MainActivity。你需要這樣做,因爲doPositiveClick()只在MainActivity而不是在Activity中實現,所以你必須確保編譯器的對象是MainActivity,它會響應方法doPositiveClick()

  • doPositiveClick()只需調用getActivity()返回的MainActivity對象上的該方法。

+0

謝謝。我明白這一點。我想我錯誤地提出了我的問題。 :(。 我會把它放在這個非常簡單的方法..這是因爲TaxDialog是從MainActivity實例化的,它與MainActivity關聯嗎? – user3275095

+0

嗯,它的確是因爲它從MainActivity啓動(顯示)爲100%正確。簡單地說,就是在顯示DialogFragment之前顯示的Activity。 –

+0

謝謝。這是唯一的疑問。:) – user3275095

0

我相信你可以僅僅指剛做

this.doPsitiveClick(); 

((MainActivity)getActivity())是剛開當前活動活動,鑄造,要成爲MainActivity ..

+0

這在OnClickListener中引用了OnClickListener實例。 –

+0

我的不好 MainActivity.this.doPositiveClick() – reidisaki

+0

謝謝。我知道這是對主要活動的類型化。但是這不是指當前課程的參考嗎? – user3275095

0

當您使用fragments它只有獲得背景的方法。如上所述,您正在使用DialogFragment,並且在OnClickListener中需要上下文。

  • getActivity()是用戶定義的。
  • public final Activity getActivity() - 返回此片段當前與之關聯的活動。

爲您的代碼,其中擴展DialogFragmentTaxDialog需要上下文與AlertDialog.Builder創建AlertDialog。所以在這裏,作爲AlertDialog.Builder中的參數的getActivity()正在作爲context傳遞,其告知AlertDialog片段,它通過哪個活動連接到該片段。

+0

'getActivity()'是用戶定義的嗎? –

+0

這不是唯一的方法。對父活動的引用傳遞給onAttach(),這是片段生命週期中第一個調用的方法。 – NigelK

2

您正在使用的方法並不是完成您想要的操作的最佳方法。 Android對偵聽器以及與碎片進行通信都有很好的支持。那麼,讓我們看看如何傳達片段 - >活動方向。

首先,你需要讓你的MainActivity從一個對話框會發生什麼監聽器,所以要做到這一點,最好的方法是在你的MainActivity實施DialogInterface.OnClickListener並覆蓋的onClick(DialogInterface對話,詮釋其中)方法,這個方法將從你的fragmen中調用。所以直到現在,所有事情都是在你的MainActivity中完成的。現在

,在你的片段,你必須覆蓋onAttach(活動活動)方法,這是當片段是建立所謂的第一種方法,該方法都具有我們父活動,這種方法初始化內你的片段的監聽器(你的MainActivity)。

你的片段應該是這樣的:

private DialogInterface.OnClickListener listener; 


@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    Bundle args = getArguments(); 

    String title = args.getString("title"); 

    String message = args.getString("message"); 
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
    builder.setTitle(title); 

    builder.setMessage(message); 
    builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 

      //Calling our MainActivity Listener with a positive answer 
      listener.onClick(getDialog(), 1); 
     } 
    }); 
    builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 

      //Calling our MainActivity Listener with a negative answer 
      listener.onClick(getDialog(), 0); 
     } 
    }); 
    builder.create(); 

    return builder.create(); 
} 

@Override 
    public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    if (activity instanceof DialogInterface.OnClickListener) { 
     listener = (DialogInterface.OnClickListener) activity; 
    } else { 
     throw new ClassCastException(activity.toString() 
      + " must implemenet DialogInterface.OnClickListener"); 
    } 
    } 

而且你的主要活動的onClick()方法應該是這樣的:

@Override 
public void onClick(DialogInterface dialog, int which) { 

    switch (which) { 
    case 0: 
     //Do your negative thing 
     break; 

    case 1: 
     //Do your positive thing 
     break; 
    } 

    Toast.makeText(this, "You clicked "+ which, Toast.LENGTH_SHORT).show(); 

} 

這就是做你想做的事,最好的辦法,忘掉「硬」施放你的MainActivity類。希望它可以幫助你!

+0

謝謝。也會嘗試這一點。 – user3275095

+0

這個答案有用嗎? – r1ckr

+0

還沒有試過這個。 – user3275095

相關問題