Закройте текущую активность, когда у вас есть только ссылка на контекст - PullRequest
63 голосов
/ 21 марта 2011

Если у меня есть ссылка на Context, возможно ли завершить текущее действие?

У меня нет ссылки на текущую деятельность.

Ответы [ 7 ]

213 голосов
/ 21 марта 2011

да, с приведением:

((Activity) ctx).finish();
12 голосов
/ 10 июля 2014

Я знаю, что это старый пост, но, возможно, было бы неплохо назвать его так:

if(context instanceof Activity){
                ((Activity)context).finish(); }

Таким образом, мы убеждаемся, что не получаем ненужных ClassCastExceptions

11 голосов
/ 20 декабря 2012

В моем случае сработало следующее,

Мне нужно завершить свою деятельность в AsyncTask onPostExcute ().

Где мой класс AsyncTask - это отдельный открытый класс, в котором есть конструктор с параметромContext.

((Activity)(mContext)).finish();

У меня сработало только вышеупомянутое ... В любом случае, я получил эту идею из ответов @ 2red13 и @lucy ... Спасибо всем ...

1 голос
/ 07 октября 2015

Если вы начинаете упражнение, используя:

startActivityForResult(i, 1);

Вы можете вызвать finishActivity (1), чтобы завершить любые действия, начатые с этим кодом запроса, например:

((Activity)getContext()).finishActivity(1);

В моем случае мне нужно использовать один из обработчиков postDelayed. Используя это, вы можете быть уверены, какую деятельность вы заканчиваете. Надеюсь, это поможет!

1 голос
/ 04 июня 2011

Если у вас есть доступ к текущему виду действия, которое вы хотите завершить (например, вы находитесь в прослушивателе щелчков), вы можете сделать:

((Activity)getContext()).finish();

(Благодаря 2red13, чтобы получить меня здесь).

0 голосов
/ 29 июня 2017

У меня была такая же проблема при закрытии действия предпочтения. Вот что я сделал:

public class T2DPreferenceActivity extends PreferenceActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
          getFragmentManager().beginTransaction().replace(android.R.id.content,
                new T2DPreferenceFragment()).commit();
    }

    public static class T2DPreferenceFragment extends PreferenceFragment {
        @Override
        public void onCreate(final Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.server_screen_preference);
            Preference testServicePreference = getPreferenceScreen().findPreference("PREFERRED SERVER");
            testServicePreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
                @Override
                public boolean onPreferenceChange(Preference preference, Object newValue) {
                    T2DPreferenceActivity.closeActivity(getActivity());
                    return true; //returning true still makes the activity handle the change to preferences
                }
            });
        }

        public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
            super.onViewCreated(view, savedInstanceState);
            ListView lv = (ListView)view.findViewById(android.R.id.list);
            ViewGroup parent = (ViewGroup)lv.getParent();
            parent.setPadding(0, 100, 0, 0);
        }
    }

    protected static void closeActivity(Activity activity) {
        activity.finish();
    }
}
0 голосов
/ 25 июня 2013

Попробуйте:

((Activity) context.getApplicationContext()).finish();
...