Jak wdrożyć potwierdzenie (tak / nie) DialogPreference?

Odpowiedzi:

292

To proste okno dialogowe z ostrzeżeniem , Federico udostępnił witrynę, na której można sprawdzić.

Oto krótki przykład, jak można zbudować okno dialogowe ostrzeżenia.

new AlertDialog.Builder(this)
.setTitle("Title")
.setMessage("Do you really want to whatever?")
.setIcon(android.R.drawable.ic_dialog_alert)
.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {

    public void onClick(DialogInterface dialog, int whichButton) {
        Toast.makeText(MainActivity.this, "Yaay", Toast.LENGTH_SHORT).show();
    }})
 .setNegativeButton(android.R.string.no, null).show();
Maaalte
źródło
3
Wiem, jak zbudować dialog, ale moje pytanie o preferencje.
sh1ng
1
Twoje pytanie dotyczy preferencji? W porządku. Spójrz tutaj: kaloer.com/android-preferences
Maaalte
1
Przeczytałem już to źródło. Mogę utworzyć niestandardowe preferencje subskrybowane do OnClick i obsłużyć to, ale czy jest to najłatwiejszy sposób?
sh1ng
Myślę, że tak, przynajmniej nie znam innej łatwiejszej drogi.
Maaalte
1
użyj importu android.support.v7.app.AlertDialog; dla lepszego wyglądu bez tematu
majurageerthan
9

Android jest wyposażony we wbudowaną klasę YesNoPreference, która robi dokładnie to, co chcesz (okno dialogowe potwierdzenia z opcjami tak i nie). Zobacz oficjalny kod źródłowy tutaj .

Niestety znajduje się w com.android.internal.preferencepakiecie, co oznacza, że ​​jest częścią prywatnych API Androida i nie możesz uzyskać do niego dostępu z poziomu swojej aplikacji (prywatne klasy API mogą ulec zmianie bez uprzedzenia, stąd Google nie pozwala na dostęp do nich).

Rozwiązanie: po prostu ponownie utwórz klasę w pakiecie swojej aplikacji, kopiując / wklejając oficjalny kod źródłowy z linku, który podałem. Próbowałem tego i działa dobrze (nie ma powodu, dla którego nie powinno).

Następnie możesz dodać go do swoich preferences.xmldowolnych innych preferencji. Przykład:

<com.example.myapp.YesNoPreference
    android:dialogMessage="Are you sure you want to revert all settings to their default values?"
    android:key="com.example.myapp.pref_reset_settings_key"
    android:summary="Revert all settings to their default values."
    android:title="Reset Settings" />

Co wygląda tak:

zrzut ekranu

XåpplI'-I0llwlg'I -
źródło
1
Świetne rozwiązanie! Ale jest problem z jednym z konstruktorów tej klasy! Odwołuje się do atr zasobu (com.android.internal.R.attr.yesNoPreferenceStyle)! Którego nie można rozwiązać. Jakie jest obejście? Czy muszę je tworzyć we własnym projekcie ?!
reubenjohn
3

Użyj preferencji intencji, jeśli używasz preferencyjnego ekranu XML lub jeśli używasz własnego ekranu, kod będzie wyglądał jak poniżej

intentClearCookies = getPreferenceManager().createPreferenceScreen(this);
    Intent clearcookies = new Intent(PopupPostPref.this, ClearCookies.class);

    intentClearCookies.setIntent(clearcookies);
    intentClearCookies.setTitle(R.string.ClearCookies);
    intentClearCookies.setEnabled(true);
    launchPrefCat.addPreference(intentClearCookies);

Następnie utwórz klasę aktywności, podobnie jak poniżej. Ponieważ różni ludzie mają różne podejście, możesz zastosować dowolne podejście, które ci się podoba, to tylko przykład.

public class ClearCookies extends Activity {


@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);

    showDialog();
}

/**
 * @throws NotFoundException
 */
private void showDialog() throws NotFoundException {
    new AlertDialog.Builder(this)
            .setTitle(getResources().getString(R.string.ClearCookies))
            .setMessage(
                    getResources().getString(R.string.ClearCookieQuestion))
            .setIcon(
                    getResources().getDrawable(
                            android.R.drawable.ic_dialog_alert))
            .setPositiveButton(
                    getResources().getString(R.string.PostiveYesButton),
                    new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog,
                                int which) {
                            //Do Something Here

                        }
                    })
            .setNegativeButton(
                    getResources().getString(R.string.NegativeNoButton),
                    new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog,
                                int which) {
                            //Do Something Here
                        }
                    }).show();
}}

Jak powiedziano wcześniej, można to zrobić na wiele sposobów. jest to jeden ze sposobów, w jaki możesz wykonać swoje zadanie, zaakceptuj odpowiedź, jeśli czujesz, że masz to, czego chciałeś.

PravinDodia
źródło
Dzięki! To jest prawie dokładnie to, czego potrzebowałem dla mojej aplikacji, ponieważ wyzwalam okno dialogowe z usługi, aw moim przypadku potrzebuję działania do hostowania okna dialogowego.
Ralph Ritoch,
Kocham to. IMHO gadatliwy, ale zatwierdzone i poprawny sposób
John