GetActivity () имеет значение null внутри AlertDialog фрагмента

Почему getActivity() возвращает null внутри AlertDialog ?

Это класс –

 Class A extends Common{ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Button save = (Button) view.findViewById(R.id.save); save.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { System.out.println("the activity outside dialog.."+getActivity()); AlertDialog.Builder alert = new AlertDialog.Builder(getActivity()); alert.setPositiveButton("Check acitivity", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { dialog.cancel(); System.out.println("the activity inside dialog.."+getActivity()); } }); } } 

Класс Common расширяет фрагмент как –

 import android.support.v4.app.Fragment; Class Common extends Fragment { //Some code } 

И выход –

 the activity outside dialog..com.testapp.main.MainActivity@42131080 the activity inside dialog..null 

  Activity activity; @Override public void onAttach(Activity activity) { super.onAttach(activity); this.activity=activity; } 

Я думаю, что getActivity () внутри DialogInterface указывает на контекст диалога

 dialog.getActivity() 

Внутри вашего диалогового окна попробуйте изменить его на:

 A.this.getActivity(); 

Изменить : я проверил getActivity () внутри DialogInterface, и он должен работать нормально.

Другое решение может использовать функцию onAttach Callback и получить вашу активность. Контекст, чтобы убедиться, что ваш фрагмент привязан к родительской активности, прежде чем использовать его в диалоговом окне. Затем используйте его вместо getActivity ().

 @Override public void onAttach(Activity activity) { super.onAttach(activity); yourActivity = activity; } 

Замените getActivity () на A.this

 AlertDialog.Builder alert = new AlertDialog.Builder(A.this); 
 Why the getActivity() is returning null inside AlertDialog ? 

Это потому, что вы вызываете getActivity () для DialogInterface.OnClickListener не ваш в фрагменте, тем самым давая вам null.

решение:

 A.this.getActivity(); 

Вам нужно вызвать ссылку своего класса, используя this и вызвать метод getActivity()

РЕДАКТИРОВАТЬ:

 @Override public void onClick(View v) { System.out.println("the activity outside dialog.."+getActivity()); AlertDialog.Builder alert = new AlertDialog.Builder(getActivity()); alert.setPositiveButton("Check acitivity", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { System.out.println("the activity inside dialog.."+ A.this.getActivity()); dialog.cancel(); } }); 

getActivity() возвращает значение null до тех пор, пока Fragment не будет getActivity() к активности.

Вы предполагаете создать объект после вызовов метода onAttach.

Вы можете создать объект в методе onCreateview для лучших практик.

Основываясь на ответах Sudhi S и Arash, я думаю, что это более чистый вариант, который касается действия локально для метода, называющего его:

 private void showDialog() { final Activity activity = getActivity(); AlertDialog.Builder builder = new AlertDialog.Builder(activity) .setTitle(R.string.my_title) .setMessage(R.string.my_message) .setNegativeButton(android.R.string.cancel, null) .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Log.e(TAG, "the activity inside dialog... " + activity); } }); final AlertDialog dialog = builder.create(); dialog.setCanceledOnTouchOutside(true); dialog.show(); }