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();

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


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ś.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.