2013-08-09 4 views
2

게임에서와 같이 세계 제작자를 만들기 위해 노력하고 있습니다. 공유 환경 설정을 사용하여 배열 등을 저장하고 있습니다. 그러나 문제가 있습니다. 정적 변수를 사용하여 다른 클래스에서 업데이트하려고합니다. 그러나 목록보기가있는 원래 클래스로 돌아 가면 아무 것도 업데이트되지 않았 음을 알게됩니다. 어떤 아이디어? 여기에 코드가 있습니다. 오, 그리고 아무 오류도 logcat에 들어왔다.공유 환경 설정이 업데이트되지 않습니다.

ListView 클래스.

package you.don't.need-to-know; 

import android.app.ListActivity; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.os.Bundle; 
import android.preference.PreferenceManager; 
import android.view.View; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 


public class WorldMenu extends ListActivity{ 
public static SharedPreferences prefs = null; 
static String splitter; 
String[] worldList; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    prefs = PreferenceManager.getDefaultSharedPreferences(this); 
    splitter = "Create World," + prefs.getString("worldString", ""); 
    worldList = splitter.split(","); 
    setListAdapter(new ArrayAdapter<String>(WorldMenu.this, 
    android.R.layout.simple_list_item_1, worldList)); 


} 
@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
    // TODO Auto-generated method stub 
    super.onListItemClick(l, v, position, id); 
    if(position == 0){ 
     Intent openWorldNamer = new           
Intent("you.don't.need-to-know"); 
     startActivity(openWorldNamer); 
    } 

} 


} 

업데이터 :

package you.don't.need-to-know; 

import android.app.Activity; 
import android.content.Intent; 
import android.content.SharedPreferences.Editor; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 

public class WorldCreator extends Activity{ 
EditText worldNameEditor; 
Button saver; 
static String updater; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_worldcreator); 
    worldNameEditor = (EditText) findViewById(R.id.editText1); 
    saver = (Button) findViewById(R.id.button1); 
    updater = worldNameEditor.getText().toString() + ","; 
    saver.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      Editor editor = WorldMenu.prefs.edit(); 
      editor.putString("worldString", updater); 
      editor.commit(); 
      Intent openListWorld = new 
Intent("you.don't.need.to-know"); 
      startActivity(openListWorld); 
     } 
    }); 
} 
@Override 
protected void onPause() { 
    // TODO Auto-generated method stub 
    super.onPause(); 

} 

} 

편집 : 고정에 가까운 업데이트 새로운 코드입니다. 업데이터 및 목록 작업

업데이터 :

import android.app.Activity; 

import android.content.Intent; 

import android.content.SharedPreferences; 

import android.content.SharedPreferences.Editor; 

import android.content.SharedPreferences.OnSharedPreferenceChangeListener; 

import android.os.Bundle; 

import android.preference.PreferenceManager; 

import android.view.View; 

import android.widget.Button; 

import android.widget.EditText; 


public class WorldCreator extends Activity{ 
EditText worldNameEditor; 
Button saver; 
SharedPreferences prefs; 
OnSharedPreferenceChangeListener listener; 
String updater; 
Editor editor; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_worldcreator); 
    prefs = PreferenceManager.getDefaultSharedPreferences(this); 
    worldNameEditor = (EditText) findViewById(R.id.hello); 
    saver = (Button) findViewById(R.id.button1); 
    updater = worldNameEditor.getText().toString() + ","; 

saver.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     listener = new SharedPreferences.OnSharedPreferenceChangeListener() 
{ 
      public void onSharedPreferenceChanged(SharedPreferences  
    prefs, String key) { 
       editor = prefs.edit(); 
       editor.putString("worldString", updater); 
       editor.commit(); 
       } 
      }; 

      prefs.registerOnSharedPreferenceChangeListener(listener); 
      Intent openListWorld = new          
Intent(""); 
      startActivity(openListWorld); 

    }}); 

    } 
    @Override 
    protected void onPause() { 
     // TODO Auto-generated method stub 
     super.onPause(); 





    } 





@Override 
protected void onResume() { 
    // TODO Auto-generated method stub 
    super.onResume(); 

} 
} 

목록 활동 :

import android.app.ListActivity; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.os.Bundle; 
import android.preference.PreferenceManager; 
import android.view.View; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 


public class WorldMenu extends ListActivity{ 
SharedPreferences prefs = null; 
String splitter; 
String[] worldList; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 

} 

@Override 
protected void onResume() { 
    // TODO Auto-generated method stub 
    super.onResume(); 
    prefs = PreferenceManager.getDefaultSharedPreferences(this); 
    splitter = "Create World," + prefs.getString("worldString", "hello"); 
    worldList = splitter.split(","); 
    setListAdapter(new ArrayAdapter<String>(WorldMenu.this,   
android.R.layout.simple_list_item_1, worldList)); 
} 

@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
    // TODO Auto-generated method stub 
    super.onListItemClick(l, v, position, id); 
    if(position == 0){ 
     Intent openWorldNamer = new           
Intent(""); 
     startActivity(openWorldNamer); 
    } 

} 

@Override 
protected void onPause() { 
    // TODO Auto-generated method stub 
    super.onPause(); 
    finish(); 
} 


} 
+0

? 공유 환경 설정이 업데이트 되었습니까? – Christos

+0

여전히 동일하게 유지됩니다 – user2649191

답변

2

당신이 공유 환경의 변화를 모니터링하는 것은 보이지 않는다. 참조 : 당신이 콜백을 얻을 때

http://developer.android.com/reference/android/content/SharedPreferences.OnSharedPreferenceChangeListener.html

final SharedPreferences.OnSharedPreferenceChangeListener listener = new SharedPreferences.OnSharedPreferenceChangeListener() { 
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { 
    // update your listview. 
    } 
}; 

prefs.registerOnSharedPreferenceChangeListener(listener); 

그래서, 그것은 키가 변경 무엇을 말할 것이다. 그런 다음 목록 뷰의 어댑터를 업데이트하여 새 내용을 가지고 어댑터의 onDataSetChanged()를 호출 할 수 있습니다.

또는 어댑터 설정 코드를 onResume() 함수로 옮길 수도 있습니다. 이렇게하면 활동이 다시 시작될 때 공유 환경 설정의 상태를 확인하고 어댑터를 설정할 수 있습니다. 그러나 사용자가 목록을 약간 아래로 스크롤하고 이력서에서 setAdapter()를 다시 호출하면 스크롤 위치가 손실됩니다.

편집 :

시도 :

업데이터 (이것은 새로운 활동을 시작할 필요가 없습니다, 이것은 단지 완료 할 수 있습니다()) :

import android.app.Activity; 

import android.content.Intent; 

import android.content.SharedPreferences; 

import android.content.SharedPreferences.Editor; 

import android.content.SharedPreferences.OnSharedPreferenceChangeListener; 

import android.os.Bundle; 

import android.preference.PreferenceManager; 

import android.view.View; 

import android.widget.Button; 

import android.widget.EditText; 


public class WorldCreator extends Activity{ 
EditText worldNameEditor; 
Button saver; 
SharedPreferences prefs; 
OnSharedPreferenceChangeListener listener; 
String updater; 
Editor editor; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_worldcreator); 
    prefs = PreferenceManager.getDefaultSharedPreferences(this); 
    worldNameEditor = (EditText) findViewById(R.id.hello); 
    saver = (Button) findViewById(R.id.button1); 
    updater = worldNameEditor.getText().toString() + ","; 

saver.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
      editor = prefs.edit(); 
      editor.putString("worldString", updater); 
      editor.commit(); 
      finish(); 
    }}); 

    } 

의 ListView :

import android.app.ListActivity; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.os.Bundle; 
import android.preference.PreferenceManager; 
import android.view.View; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 


public class WorldMenu extends ListActivity{ 
SharedPreferences prefs = null; 
String splitter; 
String[] worldList; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    prefs = PreferenceManager.getDefaultSharedPreferences(this); 
final SharedPreferences.OnSharedPreferenceChangeListener listener = new SharedPreferences.OnSharedPreferenceChangeListener() { 
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { 
    // update your listview. 
    } 
}; 

prefs.registerOnSharedPreferenceChangeListener(listener); 

} 

@Override 
protected void onResume() { 
    // TODO Auto-generated method stub 
    super.onResume(); 

    splitter = "Create World," + prefs.getString("worldString", "hello"); 
    worldList = splitter.split(","); 
    setListAdapter(new ArrayAdapter<String>(WorldMenu.this,   
android.R.layout.simple_list_item_1, worldList)); 
} 

@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
    // TODO Auto-generated method stub 
    super.onListItemClick(l, v, position, id); 
    if(position == 0){ 
     Intent openWorldNamer = new           
Intent(""); 
     startActivity(openWorldNamer); 
    } 

} 
} 
+0

어떤 유형의 리스너가 int string입니까? – user2649191

+0

죄송합니다. 유형이 무엇인지 보여주기 위해 답변을 업데이트했습니다. – natez0r

+0

아, 작동하지 않았습니다. – user2649191

1

공유 우선 순위는 모든 클래스가 동일한 프로세스에있는 경우 여러 클래스에서 사용하기위한 것입니다. 명시 적으로 정적을 사용할 필요는 없습니다. 두 클래스 모두에서 동일한 공유 우선 순위를 사용하십시오.

+0

에서 코드를 사용할 수 있습니다 그래서 각 클래스에 새로운 공유 환경 설정을합니까?그리고 나는 같은 이름을 사용합니까? 이것은 급한 것이므로 빨리해야합니다. – user2649191

+0

이 링크를 참조하십시오 : http://stackoverflow.com/questions/10393273/using-sharedpreferences-across-multiple-classes – Sushil

+0

도움에 감사드립니다! – user2649191

0

원래 클래스로 돌아 가면 원래 클래스의 onCreate 메소드가 수행 할 수 있다고 보장 할 수 없습니다. 다른 대답처럼 onResume mothod에 코드를 삽입하거나 startActivity (intent) 메소드 완료 후) 현재 활동 완료

2

Prefrences는 활동 수준에서 정의됩니다. 제 현상금을 기부 해 드리겠습니다.

getActivity()를 호출하여 발신자 활동을 가져온 다음이를 사용하여 프리픽스를 가져옵니다. 구조체가 인터페이스를 통해 결과를 반환하도록하려는 경우. 인터페이스를 구현하고 인터페이스를 사용하여 활동을 찾습니다. Eclipse에서 스텁을 만듭니다.

여기에 프리 퍼런 스 저장을 변경 한 전체 클래스가 있으며, 결과를 즉시 호출 클래스에 보냅니다. getActivity()를 사용하여 두 클래스가 동일한 prefrences를 공유합니다. 인터페이스를 통해 다시 호출합니다.

이 내 응용 프로그램의 com.gosylvester.bestrides

package com.gosylvester.bestrides; 

import com.google.android.gms.maps.GoogleMap; 

import android.support.v4.app.DialogFragment; 

import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.RadioButton; 
import android.widget.RadioGroup; 
import android.widget.RadioGroup.OnCheckedChangeListener; 
import android.content.Context; 
import android.content.SharedPreferences; 
import android.os.Bundle; 

//... 

public class MapSettings extends DialogFragment implements 

    OnCheckedChangeListener { 

public static final String MAP_TYPE = "com.gosylvester.bestrides.settings.maptype"; 
private int _mapType = -1; 
BestRidesSettingsDialogListener activity; 
SharedPreferences sharedpref; 

public interface BestRidesSettingsDialogListener { 
    void onMapSettingsChange(int mapType); 
} 

public MapSettings() { 
} 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    // the activity may be null if this is called without implementing the 
    // BestRidesSettingsDialogListener (The settings object saves the 
    // setting so the 
    // call back may not be needed. 

    activity = (BestRidesSettingsDialogListener) getActivity(); 

    getDialog().setTitle(R.string.app_name); 
    View view = inflater.inflate(R.layout.activity_map_settings, container); 
    RadioGroup rg = (RadioGroup) view.findViewById(R.id.radioGroup1); 
    // initialize to the shared preferences value 
    rg.clearCheck(); 
    sharedpref = getActivity().getPreferences(Context.MODE_PRIVATE); 
    int x = sharedpref.getInt(MAP_TYPE, GoogleMap.MAP_TYPE_NORMAL); 
    RadioButton rb = null; 

    switch (x) { 
    case GoogleMap.MAP_TYPE_HYBRID: 
     rb = (RadioButton) view.findViewById(R.id.RDOHybrid); 
     rb.setChecked(true); 
     break; 
    case GoogleMap.MAP_TYPE_NORMAL: 
     rb = (RadioButton) view.findViewById(R.id.RDORoad); 
     rb.setChecked(true); 
     break; 
    case GoogleMap.MAP_TYPE_SATELLITE: 
     rb = (RadioButton) view.findViewById(R.id.RDOSatelite); 
     rb.setChecked(true); 
     break; 
    case GoogleMap.MAP_TYPE_TERRAIN: 
     rb = (RadioButton) view.findViewById(R.id.RDOTerrain); 
     rb.setChecked(true); 
     break; 
    } 
    // set the listener after setting up 
    rg.setOnCheckedChangeListener(this); 
    return view; 
} 

public int getMapType() { 
    return _mapType; 
} 

public void setMapType(int mapType) { 
    this._mapType = mapType; 
} 

@Override 
public void onCheckedChanged(RadioGroup rg, int checkId) { 
    // TODO Auto-generated method stub 
    int mapType = 0; 
    switch (checkId) { 
    case R.id.RDORoad: 
     mapType = GoogleMap.MAP_TYPE_NORMAL; 
     break; 
    case R.id.RDOHybrid: 
     mapType = GoogleMap.MAP_TYPE_HYBRID; 
     break; 
    case R.id.RDOSatelite: 
     mapType = GoogleMap.MAP_TYPE_SATELLITE; 
     break; 
    case R.id.RDOTerrain: 
     mapType = GoogleMap.MAP_TYPE_TERRAIN; 
     break; 
    } 
    // run the activity onchange 
    // if the activity is null there is no listener to take action on the 
    // settings 
    if (activity != null) { 
     activity.onMapSettingsChange(mapType); 
    } 

    // save the settings 
    if (sharedpref == null) { 
     sharedpref = getActivity().getPreferences(Context.MODE_PRIVATE); 
    } 
    sharedpref.edit().putInt(MAP_TYPE, mapType).commit(); 
} 

}에서의

/* 여기에 다른 클래스의 snipet입니다 */

public class KmlReader extends FragmentActivity implements 
     BestRidesSettingsDialogListener { 

...

mMap.setMapType(sharedPref.getInt(
       com.gosylvester.bestrides.MapSettings.MAP_TYPE, 
       GoogleMap.MAP_TYPE_NORMAL)); 

...

@Override 
public void onMapSettingsChange(int mapType) { 
    // TODO Auto-generated method stub 
    if (mMap != null) { 
     mMap.setMapType(mapType); 
    } 
} 

행운

응용 프로그램을 닫고 다시 시작하면 어떻게됩니까
관련 문제