1

Я понимаю, что эта проблема была затронута много раз, но я ничего не пытаюсь работать для меня. Я все еще получаю ошибки при попытке доступа к SharedPreferences.Ошибка getSharedPreferences в классе неактивности

Из основной деятельности (McsHome) Я запускаю различные диалоги, чтобы помочь пользователю добавить местоположение.

Первый Диалог ниже, это просто всплывает сообщение о том, местоположение должно быть добавлено (PopupMessage.java):

public class PopupMessage extends DialogFragment { 

    String message = ""; 
    AddLocation addLocation; 


    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 

     addLocation = new AddLocation(); 

     // Use the Builder class for convenient dialog construction 
     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
     builder.setMessage(message) 
       .setPositiveButton("Add Location", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int id) { 
         addLocation.show(getFragmentManager(), "PopupMsgFragment"); 
        } 
       }) 
       .setNegativeButton("Ok", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int id) { 
       // 
      }; 
     }); 
     // Create the AlertDialog object and return it 
     return builder.create(); 
    } 
} 

Это дает пользователю возможность добавить место, когда эта кнопка щелкают другое диалоговое окно всплывает (AddLocation.java):

public class AddLocation extends DialogFragment { 

    EditText mcsDomain; 
    EditText friendlyName; 
    EditText password; 
    ProcessLocation addLoc; 
    String message = ""; 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 

     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
     LayoutInflater inflater = getActivity().getLayoutInflater(); 
     View layout = inflater.inflate(R.layout.add_location_dialog, null); // Pass null as the parent view because its going in the dialog layout 
     mcsDomain = (EditText) layout.findViewById(R.id.mcsDomain); 
     friendlyName = (EditText) layout.findViewById(R.id.friendlyName); 
     password = (EditText) layout.findViewById(R.id.password); 

     builder.setView(layout) 
       .setTitle("Add/Update Location") 
     // Add action buttons 
       .setPositiveButton("Add/Update", new DialogInterface.OnClickListener() { 
        @Override 

        public void onClick(DialogInterface dialog, int id) { 

         // Passes the chosen location parameters to the ProcessLocation class 
         addLoc.processLocation(mcsDomain.getText().toString(),friendlyName.getText().toString(),password.getText().toString()); 

        } 
       }) 
       .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int id) { 

        } 
       });  
     return builder.create(); 
    } 

AddLocation.java использует схему XML, которая включает в себя 3 EditText поля. Значения этих данных передаются третьему классу ProcessLocation.java, который включает в себя метод processLocation().

public class ProcessLocation { 


    SharedPreferences domainToName; 
    SharedPreferences nameToDomain; 


    public void processLocation(String domain, String name, String password) { 

      domainToName = getSharedPreferences("domainToName", MODE_PRIVATE); 
      nameToDomain = getSharedPreferences("nameToDomain", MODE_PRIVATE); 
     // final Editor domainEdit = domainToName.edit(); 
     // final Editor nameEdit = nameToDomain.edit(); 

      if (nameToDomain.contains(name)) { 
        System.out.println("Name Doesn't Exist"); 
       } 

     } 

} 

Я получаю сообщение об ошибке на MODE_PRIVATE, я считаю, связанной с контекстом. Я играю с контекстом часами без везения (или понимания). Я знаю, что я вывожу пару диалогов подряд. Если я добавлю «extends Activity», ошибка исчезнет, ​​но затем приложение сработает при попытке getSharedPreferences.

От просмотра других сообщений, я уверен, что это связано с передачей контекста из моей активности McSHome.java, но все, что я пробовал, потерпело неудачу.

+0

Какая ошибка? – ToYonos

+0

Вы попробовали this.MODE_PRIVATE или getActivity(). MODE_PRIVATE? – Lukos

+0

Попробуйте Context.MODE_PRIVATE, капитал C и импортируйте файл android.content.Context; – zgc7009

ответ

1

Прежде всего, в AddLocation вы объявляете переменную-член addLoc, но никогда не назначаете ее ни на что. Если вы все-таки это собрать, было бы бросить NullPointerException здесь:

addLoc.processLocation(mcsDomain.getText().toString(), friendlyName.getText().toString(), 
     password.getText().toString()); 

getSharedPreferences() является метод Context класса. В ProcessLocation.processLocation() вы пытаетесь это назвать. Этот метод не существует в классе ProcessLocation.

Вам нужно сделать следующее:

1) ProcessLocation должен иметь Context ссылку, так что она может вызывать getSharedPreferences(). Самый простой способ сделать это - объявить переменную-член в ProcessLocation типа Context и инициализировать ее в конструкторе ProcessLocation. Как это:

public class ProcessLocation { 
    Context context; 
    SharedPreferences domainToName; 
    SharedPreferences nameToDomain; 
    // Constructor 
    ProcessLocation(Context context) { 
     this.context = context; 
    } 

2) Вам нужно создать экземпляр ProcessLocation. В AddLocation перед использованием переменной addLoc вам необходимо ее инициализировать. Как это:

// Create instance of ProcessLocation and pass it the activity (Activity is a Context) 
    addLoc = new ProcessLocation(getActivity); 

3) Используйте Context в ProcessLocation.processLocation(), как это:

public void processLocation(String domain, String name, String password) { 
     domainToName = context.getSharedPreferences("domainToName", Context.MODE_PRIVATE); 
     nameToDomain = context.getSharedPreferences("nameToDomain", Context.MODE_PRIVATE); 
     ... 
    } 

Это поздно, и я устал, и я не ставил это через компилятор, поэтому, пожалуйста, простите мне, если бы я оставил запятую или точку с запятой или что-то не так. Надеюсь, вы получите дрейф. Удачи!

Смежные вопросы