我想在 android 中创建一个 PreferenceFragment。应该有一个项目允许用户将他的旧数据库导入应用程序。在我找到 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>
我的想法
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)我能想到的最好的方法就是有一个像这样的项目,在点击时打开意图
我找到的最接近的帮助是这个。这听起来不是一个好方法,而且我也 3 岁了,我真的不明白如何在我的设置类中获取 DialogPreference 对象:
startactivityforresult from dialogpreference(非活动)
有用的链接:
http://developer.android.com/reference/android/preference/DialogPreference.html