Создание намерения путем нажатия на элемент в PreferenceFragment

Я хочу создать PreferenceFragment в Android. Там должен быть пункт, который позволяет пользователю импортировать свою старую базу данных в приложение. До того, как я нашел PreferenceFragment, я использовал свой собственный SettingsFragment, но так как это кажется лучше (и для всего остального, кроме этого, это atm), я попытался использовать это.

Моя проблема в том, что я использовал startActivityForResult с намерением получить файл и импортировать базу данных. Это было вызвано нажатием кнопки. В новом фрагменте предпочтений у меня нет способа получить клики.

Вот мой Settings.xml:

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


    <com.myContainer.myApp.helper.ImportDatabaseSettingsDialog
        android:id="@+id/database1"
        android:key="import_database"
        android:title="@string/importDatabaseFromDB" />

    <SwitchPreference
        android:key="pref_beta"
        android:title="@string/enableBeta"
        android:summary="@string/enableBetaSummary"
        android:defaultValue="false" />

    <Preference
        android:id="@+id/database2"
    android:key="import_database"
    android:title="@string/importDatabaseFromDB" />

    <ListPreference
        android:id="@+id/database3"
        android:key="import_database"
        android:title="@string/importDatabaseFromDB" />


</PreferenceScreen>

Идея у меня была

а) я пытался получить OnClickListeners

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    View data1 = mSettingsFragmentView.findViewById(R.id.database1);
    View data2 = mSettingsFragmentView.findViewById(R.id.database2);
    View data3 =  mSettingsFragmentView.findViewById(R.id.database3);

    data1.setOnClickListener(this);
    data2.setOnClickListener(this);
    data3.setOnClickListener(this);
}

Я получаю это: Попытка вызвать виртуальный метод 'void android.view.View.setOnClickListener(android.view.View$OnClickListener)' для пустой ссылки на объект

Поэтому я не могу получить элементы из settings.xml, я думаю.

б) Другая идея, которая у меня была, - это использование DialogPreference. Я использую тот же файл settings.xml, что и выше.

package com.pi314.mylife.helper;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.preference.DialogPreference;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.Toast;

import com.pi314.mylife.R;

import static android.app.PendingIntent.getActivity;
import static android.support.v4.app.ActivityCompat.startActivityForResult;

/**
 * Created  on 20.09.2015.
 */
public class ImportDatabaseSettingsDialog extends DialogPreference {

    private static final int SELECT_DATABASEFILE = 1;

    public ImportDatabaseSettingsDialog(Context context, AttributeSet attrs) {
        super(context, attrs);

        //setDialogLayoutResource(R.layout.numberpicker_dialog);
        setDialogMessage(R.string.ARE_YOU_SURE_YOU_WANT_IMPORT);
        setPositiveButtonText(android.R.string.ok);
        setNegativeButtonText(android.R.string.cancel);

        setDialogIcon(null);
    }


    @Override
    protected void onDialogClosed(boolean positiveResult) {
        super.onDialogClosed(positiveResult);

        if (positiveResult) {

            Log.d("ml Settings", "importing database");
            Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
            intent.setType("*/*");
            intent.addCategory(Intent.CATEGORY_OPENABLE);
            Intent finalIntent = Intent.createChooser(intent, "Select databasefile");
            startActivityForResult(finalIntent, SELECT_DATABASEFILE);
        }
    }


}

Но я не могу использовать startActivityForResult, так как в моей DialogPreference отсутствует активность.

c) Лучший способ, которым я мог бы подумать, это просто иметь такой элемент, который открывает намерение при нажатии

Самая близкая помощь, которую я нашел, была это. Это не очень хороший способ, и мне тоже 3 года, и я не совсем понимаю, как получить объект DialogPreference в моем классе настроек:

startactivityforresult из диалогового предпочтения (не активность)

Полезные ссылки:

http://developer.android.com/reference/android/preference/DialogPreference.html

http://developer.android.com/guide/topics/ui/settings.html

1 ответ

Решение

Я решил это сам. Так что вот решение, если кому-то интересно. Теперь я использую Preferences в settings.xml и создал onPreferenceClickListener в моем фрагменте.

settings.xml:

<Preference
    android:key="export_database"
    android:summary="@string/exportDatabasefileSummary"
    android:title="@string/exportDatabasefile" />

<Preference
    android:key="import_database"
    android:summary="@string/importDatabaseFromDBSummary"
    android:title="@string/importDatabaseFromDB" />

Фрагмент:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Load the preferences from an XML resource
    addPreferencesFromResource(R.xml.settings);

    Preference preferenceImportDatabase = findPreference("import_database");
    preferenceImportDatabase.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
        @Override
        public boolean onPreferenceClick(Preference preference) {
            importDatabaseFromDB();
            return false;
        }
    });

    Preference preferenceExportDatabase = findPreference("export_database");
    preferenceExportDatabase.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
        @Override
        public boolean onPreferenceClick(Preference preference) {
            exportDatabasefile();
            return false;
        }
    });
}
Другие вопросы по тегам