2012-09-13 12 views
5

Mam problem, czytając getSharedPreferences z klasy Non-Activity, aby ustawić listę odtwarzania w odtwarzaczu ... W mojej aktywności biorę zmienną łańcuchową z edittext, aby uzyskać ścieżkę folderu do pracy z plikami audio ...Android non-Activity getSharedPreferences

public class MainActivity extends Activity { 


String ppp; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    String PATH = getSharedPreferences("PATH", MODE_PRIVATE).getString("path", ppp); 
    if (PATH == null){ 
     .......... 
      ........... 
     path_tv.setText("folder is undefined"); 
    } 
    else { 
     path_tv.setText("folder defined: /mnt/sdcard/" + PATH); 
    } 
    set_path.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      if (path_edit.getText().toString().length() == 0){ 
       Toast.makeText(getBaseContext(), "folder is undefined", Toast.LENGTH_SHORT).show(); 
      } 
      else { 
      ppp = path_edit.getText().toString(); 
      getSharedPreferences("PATH", MODE_PRIVATE) 
      .edit() 
      .putString("path", ppp) 
      .commit(); 
      File folder = new File(Environment.getExternalStorageDirectory() + "/" + ppp); 
      boolean success = false; 
      if (!folder.exists()) { 
       success = folder.mkdir(); 
       if (success) Toast.makeText(getBaseContext(), ".....", Toast.LENGTH_SHORT).show(); 
      } 
      String PATH = getSharedPreferences("PATH", MODE_PRIVATE).getString("path", ppp); 
      path_tv.setText("........ /mnt/sdcard/" + PATH); 
      path_edit.setText(""); 
      } 
     } 
    }); 

Więc aktywności mogę zmienić i zapisać wartość String w udostępnionych preferencji ho ... Ale mogę to zrobić z klasą publiczną ...? Doceń wszelkie przykłady ...

Odpowiedz

8

Jednym ze sposobów jest użycie Application obiektu . To jest brudny hack, ale nie mniej pomocne.

Najpierw trzeba członka statycznego w swojej klasie aplikacji, więc:

public class MyApplication extends Application { 
    private static MyApplication instance; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     instance = this; 
    } 

    public static MyApplication getInstance() { 
     return instance; 
    } 
} 

Ponieważ celem aplikacji jest zawsze tworzone przed tworzony jest każda aktywność i biegać i jest utrzymywana przez cały okres aplikacji zawsze można mieć pewność, że będzie mieć odpowiedni.

Następnie w swoim kodzie wystarczy zadzwonić pod numer MyApplication.getInstance(), aby uzyskać kontekst aplikacji globalnej.

Pamiętaj, aby zadeklarować MyApplication w manifeście.

+0

Ok, dodałem MyApp do manifestu i jako klasę z rozszerzeniami ... Teraz w mojej klasie stworzyłem konstruktora, gdzie dodano AppApp.getInstance(); – timonvlad

+0

Ale nadal daje zerowy wyjątek .... na czym polega problem? – timonvlad

+0

Czy możesz podać ślad stosu? ewentualnie na mój e-mail - kiedy rozwiążemy Twój problem, możemy edytować twoje pytanie lub moją odpowiedź. Używam tego typu rozwiązania kilka razy. –

0

dodaj MainActivity.this. Zanim getSharedPreferences

+0

To nie działa! !!! – timonvlad

1

zdać kontekstu w konstruktorze klasy, a następnie użyć tego kontekstu do wykonywania operacji odczytu lub zapisu preferencji zakładowego jak jak

  public class xyx{ 
      public xyx(Context context){ 
      this.context= context 
      } 

    Now use this context 
8

trzeba uzyskać kontekst przekazany do metody klasy:

główną działalność:

public class MainActivity extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Test t = new Test("Show Preference: "); 
     getSharedPreferences("PATH", MODE_PRIVATE) 
     .edit() 
     .putString("p", "preference") 
     .commit(); 
     t.showToast(this.getApplicationContext()); 
    } 
} 

TestClass:

public class Test { 
    private String s; 

    public Test(String s){ 
     this.s = s; 
    } 

    public void showToast (Context c){ 
     String pref = c.getSharedPreferences("PATH", Context.MODE_PRIVATE).getString("p", "Error"); 
     Toast.makeText(c.getApplicationContext(), s + pref, Toast.LENGTH_LONG).show(); 
    } 
} 

nadzieję pomóc

Powiązane problemy