通过单击 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
我自己解决了。所以这里是解决方案,如果有人感兴趣的话。
我现在在 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;
}
});
}
我想在 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
我自己解决了。所以这里是解决方案,如果有人感兴趣的话。 我现在在 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;
}
});
}