getOwnerActivity возвращает значение NULL в настраиваемом диалоговом окне. - PullRequest
10 голосов
/ 25 сентября 2011

Я пишу пользовательский диалог и пытаюсь получить некоторые данные из родительской активности, но всегда получаю null при вызове getOwnerActivity , кто-нибудь может мне сказать, почему это произошло? Почему я могу показать данные в DemoDialog, но не смог отобразить данные из TestDialogActivity?

Большое спасибо заранее.

DialogTestActivity

public class DialogTestActivity extends Activity {
    List<String> data = new ArrayList<String>();
    Button button;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        button = (Button)findViewById(R.id.button);
        button.setOnClickListener(new OnClickListener(){
            public void onClick(View v) {
                showDialog(0);
            }
        });
    }

    public List<String> getData(){
        data.add("one");
        data.add("two");
        data.add("three");
        return data;
    }

    public Dialog onCreateDialog(int id){
        return new DemoDialog(this);
    }
}

DemoDialog

public class DemoDialog extends Dialog {
    Context context;

    public DemoDialog(Context context) {
        super(context);
        setContentView(R.layout.dialog);
        this.context = context;
        setTitle("Delete City");
        ListView list = (ListView)findViewById(R.id.list);
        ArrayAdapter<String> aa = new ArrayAdapter<String>(context, android.R.layout.simple_list_item_multiple_choice, ((DialogTestActivity)getOwnerActivity()).getData());
//      ArrayAdapter<String> aa = new ArrayAdapter<String>(context, android.R.layout.simple_list_item_multiple_choice, getData());
        list.setAdapter(aa);
        list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
    }

    private List<String> getData(){
        List<String> data = new ArrayList<String>();
        data.add("1");
        data.add("2");
        return data;
    }
}

Ответы [ 4 ]

23 голосов
/ 19 декабря 2012

Я пытался использовать метод getOwnerActivity() во всех возможных методах моего custom Dialog. Всегда возвращает ноль (Android 2.3). Затем я проверил его исходный код, и возвращаемая активность устанавливается только в setOwnerActivity(Activity activity), который нигде не вызывается Поэтому, если вы хотите, чтобы getOwnerActivity() возвращало значение, отличное от нуля, вы должны сделать это:

public MyCustomDialog(Context context) {
    super(context);
    if (context instanceof Activity) {
        setOwnerActivity((Activity) context);
    }
} 
7 голосов
/ 25 сентября 2011

Если вы подумаете о ситуации, вы поймете, почему.Когда вы вызываете new DemoDialog(this), вы выполняете весь код в конструкторе.После этого вы возвращаете его из onCreateDialog, и Android делает свое волшебство.Если вы пытаетесь получить владельца из конструктора, Android еще не подключил его, поэтому у вас еще нет владельца.

Так что вы можете сделать одно из следующих действий:

public class DemoDialog extends Dialog {
    public DemoDialog(Context context) {
        super(context);

        // chances of context not being an activity is very low, but better to check.
        Activity owner = (context instanceof Activity) ? (Activity)context : null;
        if (owner != null) {
            // owner activity is defined here
        }
    }

    public void onAttachedToWindow() {
        super.onAttachedToWindow();
        // getOwnerActivity() should be defined here if called via showDialog(), so do the related init here
        Activity owner = getOwnerActivity();
        if (owner != null) {
            // owner activity defined here
        }
    }
}

Обратите внимание, чтовторой метод предпочтительнее, потому что

1 голос
/ 26 января 2017

Вы можете расширить свой пользовательский диалог с AppCompatDialog и получить доступ к активности по этому коду:

public static Activity scanForActivity(Context context) {
    if (context == null)
        return null;
    else if (context instanceof Activity)
        return (Activity) context;
    else if (context instanceof ContextWrapper)
        return scanForActivity(((ContextWrapper) context).getBaseContext());
    return null;
}
0 голосов
/ 16 декабря 2014

Это ниже работает для меня.

private Activity activity;

public MyCustomDialog(Activity activity) {
    super(activity);
    this.activity = activity;
} 

Тогда я использую активность вместо getOwnerActivity ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...