1

getter メソッドと setter メソッドを備えた 1 つのクラス ApplicationDetails があります。

public class ApplicationDetails {
    String supportURL;
    String companyURL;
    String copyRightText;

    // with getter and setter methods 

}

スプラッシュ スクリーン アクティビティですべてのデータを設定しています。

ApplicationDetails appDetails = new ApplicationDetails();
String supportURL = getResources().getString(R.string.support_url);
appDetails.setSupportURL(supportURL);

サンプルでは、​​文字列ファイルからデータを設定するだけですが、アプリではさまざまなソースからのものです。

しかし、別のアクティビティでデータにアクセスしようとすると、null 値が返されます。例えば

public class AboutViewController extends Activity {

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ApplicationDetails appDetails = new ApplicationDetails();
        System.out.println(" app support url " + appDetails.getSupportURL());
    }

}

出力

I/System.out(2242):  app support url null

どんな助けでも。

4

5 に答える 5

5

新しいオブジェクトを作成し、すべてのフィールドがゼロに初期化されるため、nullになります。

あなたの場合、これらのフィールドはアプリケーションを通じて同じになると思います。そのため、シングルトンパターンを使用して、アプリケーションのオブジェクトを1つだけインスタンス化し、後で参照することができます。参照するたびに新しいオブジェクトを作成する必要はありません。このクラスは問題ありません。定数にすることもできます。(これらの変数は実行によって変更されないと思います)

于 2013-01-21T13:15:09.200 に答える
0

すべての提案に感謝します。現在、クラスのインスタンスを1つだけ使用しています。

public class ApplicationDetails {

private static ApplicationDetails instance = null;

String supportURL;
String companyURL;
String copyRightText;

// with getter and setter methods 

public static ApplicationDetails getInstance() {
 if (instance == null) {
    instance = new ApplicationDetails();
 }
   return instance;
 }

}

そして、私はこのように設定して取得しています

 ApplicationDetails appDetails = ApplicationDetails.getInstance();
 appDetails.setSupportURL(supportURL);

と活動中

ApplicationDetails appDetails = ApplicationDetails.getInstance();
appDetails.getSupportURL();

そのwrksは大丈夫です。

于 2013-01-21T13:22:22.300 に答える
0

迅速な解決策として、supportURL オブジェクトを静的にすることができますが、これは良い解決策ではありません。

public class ApplicationDetails {
static String supportURL;
static String companyURL;
static String copyRightText;

// with getter and setter methods 

}

より良い解決策は、AboutViewController アクティビティを開始するときに、あるアクティビティから別のアクティビティに意図を持って文字列を渡すことです。

于 2013-01-21T13:11:46.890 に答える
0

共有設定を使用して、アプリケーションで使用するデータを保存できます。ここで、コンストラクターのコンテキストはアクティビティに他なりません。

public class ApplicationDetails {

        public static final String SUPPORT_URL = "support_url"; 
        public static final String COMPANY_URL = "company_url";
        public static final String COPYRIGHT_URL = "copyright_url";

        String supportURL;
        String companyURL;
        String copyRightText;
        private Context context;

        public ApplicationDetails(Context context) {
            super();
            this.context = context;
        }

        private String getPreference(String key)
        {
            return PreferenceManager.getDefaultSharedPreferences(context).getString(key, null);
        }

        private void setPreference(String key, String value)
        {
            PreferenceManager.getDefaultSharedPreferences(context).edit().putString(key, value).commit();
        }

        public String getSupportURL() {
            if(supportURL == null)
                supportURL = getPreference(SUPPORT_URL);
            return supportURL;
        }

        public void setSupportURL(String supportURL) {
            this.supportURL = supportURL;
            setPreference(SUPPORT_URL, supportURL);
        }

        public String getCompanyURL() {
            if(supportURL == null)
                supportURL = getPreference(COMPANY_URL);
            return companyURL;
        }

        public void setCompanyURL(String companyURL) {
            this.companyURL = companyURL;
            setPreference(COMPANY_URL, companyURL);
        }

        public String getCopyRightText() {
            if(copyRightText == null)
                copyRightText = getPreference(COPYRIGHT_URL);
            return copyRightText;
        }

        public void setCopyRightText(String copyRightText) {
            this.copyRightText = copyRightText;
            setPreference(COPYRIGHT_URL, copyRightText);
        }
    }
于 2013-01-21T13:14:44.810 に答える
-2

アップデート

スプラッシュ画面で値を設定すると、メモリ内のオブジェクトが異なり、別のアクティビティで別のオブジェクトを作成すると、メモリ内でも異なるため、null になります。

これがスプラッシュ画面で URL を初期化する必要があり、別の画面で使用される場合、多くの方法があります。

  1. スプラッシュ画面に入ると、アクティビティで文字列を直接取得します。
  2. スプラッシュ画面で appDetails オブジェクトを public static にして、別のアクティビティでもアクセスできるようにします
  3. ApplicationDetails にシリアル化を実装し、アクティビティ間でデータを渡すための文字列、int などの値を配置し、開始されたアクティビティでバンドルを使用してこのデータを取得するため、このオブジェクトを putExtra に配置します。

編集済み

単一のオブジェクトを使用するには、そのオブジェクトをスプラッシュ画面で public static として宣言する必要があります

public static ApplicationDetails appDetails;

スプラッシュ画面の oncreate() に値を割り当て、このように別のアクティビティまたは別のクラスでも使用されるようになりました

public class AboutViewController extends Activity {

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // direct use object by class name
        System.out.println(" app support url " + SplashScreen.appDetails.getSupportURL());
    }

}
于 2013-01-21T13:04:32.153 に答える