通过单击 PreferenceFragment 中的项目创建意图

Creating an intent by clicking a item in a PreferenceFragment

我想在 android 中创建一个 PreferenceFragment。应该有一个项目允许用户将他的旧数据库导入到应用程序中。 在我找到 PreferenceFragment 之前,我使用了我自己的 SettingsFragment,但因为这似乎更好(除了它之外的所有其他东西,它是 atm)我尝试使用它。

我的问题是我使用 startActivityForResult 是为了获取文件并导入数据库。这是通过单击按钮调用的。在新的 Preference Fragment 中,我真的没有办法获得点击。

这是我的 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>

我的想法

a) 我尝试获取 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 中获取物品。

b) 我的另一个想法是使用 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 中没有 Acitivity。

c) 我能想到的最好的方法就是让一个像这样的项目在点击

时打开 intent

我找到的最接近的帮助是这个。这听起来不是一个好方法,我也有 3 岁了,我真的不知道如何在我的设置中获取 DialogPreference 对象 class:

startactivityforresult from dialogpreference (non activity)

有帮助的完整链接:

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

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

我自己解决了。所以这里是解决方案,如果有人感兴趣的话。 我现在在 settings.xml 中使用 Preferences 并在我的片段中创建 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;
        }
    });
}