web-dev-qa-db-ja.com

アクティビティコンテキストを非アクティビティクラスandroidに取得する方法は?

ヘルパークラス(非アクティビティ)クラスに情報を渡すアクティビティクラスがあります。ヘルパークラスでは、getSharedPreferences()を使用します。ただし、アクティビティコンテキストが必要なため、使用できません。

これが私のコードです:

  class myActivity extends Activity
    {
    @Override
        protected void onCreate(Bundle savedInstanceState) 
        {

            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);
            setContentView(R.layout.home);


            Info = new Authenticate().execute(ContentString).get();
            ItemsStore.SetItems(Info);

        }

    }

class ItemsStore
{
  public void SetItems(Information info)
 {
  SharedPreferences  localSettings = mContext.getSharedPreferences("FileName", Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = localSettings.edit();
            editor.putString("Url", info.Url);
            editor.putString("Email", info.Email);
 }
}

どうすればこれを達成できるのでしょうか?

11
user3354605

これを試して:

class myActivity extends Activity
{
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {

        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.home);


        Info = new Authenticate().execute(ContentString).get();
        ItemsStore.SetItems(Info, getApplicationContext());

    }

}

class ItemsStore
{
   public void SetItems(Information info, Context mContext)
   {
            SharedPreferences  localSettings = mContext.getSharedPreferences("FileName",
            Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = localSettings.edit();
            editor.putString("Url", info.Url);
            editor.putString("Email", info.Email);
   }
}
10
Mohammad Ashfaq

(クラスフィールドにアクティビティコンテキストを保持することにより)メモリリークを作成する代わりに、共有設定にはアクティビティコンテキストは必要ありませんが、コンテキストは必要ないため、このソリューションを試すことができます。

アプリケーションクラスを作成します。

public class MySuperAppApplication extends Application {
    private static Application instance;

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

    public static Context getContext() {
        return instance.getApplicationContext();
    }
}

マニフェストに登録する

<application
    ...
    Android:name=".MySuperAppApplication" >
    ...
</application>

その後、あなたはこのようなことをすることができます

public void persistItems(Information info) {
    Context context = MySuperAppApplication.getContext();
    SharedPreferences sharedPreferences = context.getSharedPreferences("urlPersistencePreferences", Context.MODE_PRIVATE);
    sharedPreferences.edit()
        .putString("Url", info.Url)
        .putString("Email", info.Email);
}

メソッドシグネチャは外部コンテキストを必要としないため、この方法で見栄えが良くなります。これは、いくつかのインターフェースの下に隠すことができます。依存関係の注入にも簡単に使用できます。

HTH

25
Gaskoin

非アクティビティクラスのコンストラクタにコンテキストを渡す必要があります

ItemsStore itemstore = new ItemStore(myActivity.this);
itemstore.SetItems(Info);

その後

Context mContext;
public ItemsStore (Context context)
{
       mContext =context;
}

mContextをアクティビティコンテキストとして使用できるようになりました。

注:コンテキストアクティビティへの長期間有効な参照を保持しないでください(アクティビティへの参照は、アクティビティ自体と同じライフサイクルを持つ必要があります)

6
Raghunandan

アクティビティにパブリック関数を記述します。 Activityクラスでヘルパークラスのインスタンスを作成するときに、アクティビティーのコンテキストをコンストラクターで渡します。

次に、ヘルパークラスから、アクティビティコンテキストを使用して、アクティビティクラスのパブリック関数を呼び出します。

0
Sushil