Кнопка Android в настройках, меняющих MainActivity - PullRequest
0 голосов
/ 24 мая 2019

У меня есть предпочтительная операция, в которую я хотел бы добавить кнопку.Если эта кнопка нажата, она должна загрузить некоторые данные и обновить MainActivity.

Как я могу изменить вещи в MainActivity из PreferenceActivity?

Я не могу понять это из всехдругие вопросы, так что спасибо, что указали мне на решение!:)

Мой код

res / xml / preferences.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

    <Preference
        android:key="loadDataButton"
        android:title="Click to update data"
        android:summary="This needs internet connection."
        android:widgetLayout="@layout/load_data_button"
        ></Preference>
</PreferenceScreen>

Редактировать: res / layout / load_data_button.xml

Возможно, здесь также можно использовать onClick.

<?xml version="1.0" encoding="utf-8"?>
<Button
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/loadDataButton"
    android:text="Button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="loadDataButtonClicked">
</Button>

PreferencesActivity.java

Я думаю, что получение Toast здесь, чтобы работать, показало бы мне, как решить проблему.

import android.os.Bundle;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceFragment;
import android.widget.Toast;

public class PreferencesActivity extends PreferenceActivity {

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

    }

    public static class MyPreferenceFragment extends PreferenceFragment
    {
        @Override
        public void onCreate(final Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.preferences);

            Preference button = findPreference("loadDataButton");
            button.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
                @Override
                public boolean onPreferenceClick(Preference preference) {

                    // simple code works, but I can't access MainActivity
                    Toast.makeText(getApplicationContext(), "Test which doesn't work.", Toast.LENGTH_SHORT).show();

                    return true;
                }
            });


        }

    }

}

Функция, которую я действительно хочу вызвать нажатием кнопки

Предположительно, эта функция находится в MainActivity.java внутри класса public class MainActivity extends AppCompatActivity {...}

    public void loadDataButtonClicked(View v) {

        // If permission not given
        if (ContextCompat.checkSelfPermission(getApplicationContext(),
                Manifest.permission.INTERNET) == PackageManager.PERMISSION_DENIED) {
            ActivityCompat.requestPermissions((Activity) getApplicationContext(),
                    new String[] {Manifest.permission.INTERNET},
                    0x2);

        }

        SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
        final String event_key = SP.getString("event_key", "None");

        RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
        String url ="https://www.google.com";

        StringRequest stringRequest = new StringRequest(Request.Method.POST, url,
                new Response.Listener<String>() {/* not important*/};

        queue.add(stringRequest);

    }

1 Ответ

0 голосов
/ 24 мая 2019

Невозможно отобразить 2 действия одновременно на экране из одного и того же приложения.Это означает, что основное действие не может работать, пока оно не находится на вершине стека.

Итак, как вызывается действие предпочтения?Что запускает основное действие после изменения предпочтения?

Итак, если пользователь входит в основное действие и намерение открывает действие предпочтения, у вас есть несколько способов сделать это.

Вы можете запуститьpreferenceActivity ожидает результата и там, где код тоста, вы можете загрузить данные (лучше всего, если они асинхронные) и после этого завершить действие с результатом.

Другой вариант - это то, что есть в комментариях.Заставьте MainActivity прослушивать трансляцию в onResume и onPause прекратить прослушивание.Затем действие предпочтения запускает асинхронный процесс и завершает себя.Теперь основное действие будет видно, и когда асинхронный процесс завершится, отправьте широковещательную рассылку, которую получит основное действие.Если асинхронный процесс может быть быстрым, то, возможно, сохраните информацию в общих настройках и получите данные при запуске MainActivity.Или вы можете также запустить MainActivity с флагом, чтобы вернуться в стек и передать дополнительный параметр, который вы можете получить в методе onNewIntent () в mainActivity, и выполнить ту работу, которую вы хотите.

Но в принципе, чтовам нужно найти способ передачи информации из одного действия в другое в стеке.

...