2

私はゲームのような世界の創造者を作ろうとしています。共有設定を使用して配列などを保存しています。しかし問題がある。別のクラスから更新しようとしているので、静的変数を使用して更新します。しかし、リスト ビューで元のクラスに戻ると、何も更新されていないことがわかります。何か案は?これがコードです。ああ、logcat にエラーはありませんでした。

リストビュー クラス。

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();
}


}
4

4 に答える 4

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() を再度呼び出すと、スクロール位置が失われることに注意してください。

編集:

試す:

アップデーター (新しいアクティビティを開始する必要はありません。finish() だけでかまいません):

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();
    }});

    }

リストビュー:

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);
    }

}
}
于 2013-08-09T00:33:41.643 に答える
0

元のクラスに戻ったときに、元のクラスの onCreate メソッドが実行できることを保証するものではありません。他の回答が言うように、コードを onResume メソッドに入れるか、startActivity(intent) の後にメソッド finish() を追加して現在を終了することができます。アクティビティ

于 2013-08-09T02:48:02.643 に答える