0

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

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

Вот мой 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> 

idead я имел

а) Я попытался получить 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.

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

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

startactivityforresult from dialogpreference (non activity)

ПОЛЕЗНЫЕ ссылки:

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

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

ответ

0

Я решил это сам. Итак, вот решение, если кто-то заинтересован. Теперь я использую 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; 
     } 
    }); 
}