0
import android.content.Context;
import android.content.SharedPreferences;
import android.net.Uri;

public class LoadSettings 
{
public static void LoadMySettings   (Context ctx)
{
SharedPreferences sharedPreferences = ctx.getSharedPreferences("MY_SHARED_PREF", 0);
String strSavedMem1 = sharedPreferences.getString("gSendTo", "");
String strSavedMem2 = sharedPreferences.getString("gInsertInto", "");
String cCalId = sharedPreferences.getString("gCalID", "");

setInsertIntoStr(strSavedMem2);
setSendToStr(strSavedMem1);
}

private static String cSendToStr;
private static String cInsertIntoStr;
private int cCalId;
private Uri cCalendars;

public String getSendToStr()
{
    return this.cSendToStr;
}
public static void setSendToStr(String pSendToStr)
{
    cSendToStr = pSendToStr;
}
public String getInsertIntoStr()
{
return this.cInsertIntoStr;
}

public static void setInsertIntoStr(String pInsertIntoStr)
{
cInsertIntoStr = pInsertIntoStr;
}

}

呼び出し側のクラスから、私は現在の多くのことを試しました。

LoadSettings.LoadMySettings(this);

しかし、たとえばデータを取得しようとすると。

textSavedMem1.setText(LoadSettings.getSendToStr());

Nullエラーが発生します。

4

2 に答える 2

4

LoadMySettingsはクラスではなくメソッドです (したがって、Oracle/Sun の Java 言語の命名規則に従っている場合は、小文字で始める必要があります)。

実際に を呼び出してアクセスします。LoadSettings.loadMySettings(someContext)ここで、someContextは渡すコンテキストです。あなたの例では、何が参照されているかわからないthisため、エラーがそこにある可能性があります。


次に、これを行うと:textSavedMem1.setText(LoadSettings.getSendToStr());

非静的メソッドを呼び出すため、インスタンスを使用するかLoadSettings、コードを考慮する可能性が高いため、次のように変更できgetSendToStrます。

    public static String getSendToStr()
    {
        return cSendToStr;
    }

それはかなり悪いデザインのようですが。

あなたがやろうとしていることについてもっと教えていただければ、私たちの答えがあなたを一歩前進させるだけなので、もっと助けることができるかもしれません.


編集: わかりました、私はあなたが何をしようとしているのかを理解しました...

基本的な Java の概念に戻って学習し、最初にアクセス修飾子コンストラクター、および Java の OO セマンティクス全般について読む必要があります。

クラスを次のように変更します。

public class LoadSettings 
{
    public LoadSettings(Context ctx)
    {
        SharedPreferences sharedPreferences =
            ctx.getSharedPreferences("MY_SHARED_PREF", 0);
        String strSavedMem1 = sharedPreferences.getString("gSendTo", "");
        String strSavedMem2 = sharedPreferences.getString("gInsertInto", "");
        String cCalId = sharedPreferences.getString("gCalID", "");

        setInsertIntoStr(strSavedMem2);
        setSendToStr(strSavedMem1);
    }

    private String cSendToStr;
    private String cInsertIntoStr;
    private int cCalId;
    private Uri cCalendars;

    public String getSendToStr()
    {
       return cSendToStr;
    }

    public void setSendToStr(String pSendToStr)
    {
        cSendToStr = pSendToStr;
    }

    public String getInsertIntoStr()
    {
        return cInsertIntoStr;
    }

    public void setInsertIntoStr(String pInsertIntoStr)
    {
        cInsertIntoStr = pInsertIntoStr;
    }

}

そして、次の新しいインスタンスを作成しますLoadSettings

LoadSettings mySettings = new LoadSettings(someContext);

その後、正しく呼び出すことができます:

textSavedMem1.setText(mySettings.getSendToStr());
于 2012-07-12T04:02:10.710 に答える
1

Haylemにはその権利がありますが、コメントを追加したかっただけです:

あなたがやろうとしていることに対して、Javaには基本的に2つのデザインパターンがあります。1つは、すべてのメソッドと変数が静的であり、たとえば次のようにアクセスする静的クラスです。

LoadSettings.loadMySettings(this);
string = LoadSettings.getSendToStr()
// etc.

もう 1 つのパターンは、クラスのインスタンスを 1 つだけ作成し、そのインスタンスにアクセスする「シングルトン」クラスです。

LoadSettings ls = new LoadSettings(this);
ls.loadMySettings();
string = ls.getSendToStr();

どちらの方法でも良いのですが、あなたがやっていることは両方の方法の寄せ集めであり、うまくいきません。

于 2012-07-12T18:38:36.740 に答える