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);
}
私はこれを取得します: null オブジェクト参照で仮想メソッド '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);
}
}
}
しかし、DialogPreference にアクティビティがないため、startActivityForResult を使用できません。
c)私が考えることができる最善の方法は、クリックするとインテントを開くようなアイテムを持つことです
私が見つけた最も近いヘルプはこれでした。それは素晴らしい方法のようには聞こえません.siも3歳で、設定クラスでDialogPreferenceオブジェクトを取得する方法が本当にわかりません:
startactivityforresult from dialogpreference (非アクティビティ)
役立つリンク:
http://developer.android.com/reference/android/preference/DialogPreference.html