0

1番目のアクティビティで2番目のアクティビティ値を呼び出していますが、表示されません。理由を教えてください。1番目のアクティビティでpublicstaticStringを宣言し、2番目のアクティビティで呼び出した場合は完全に表示されますが、2番目のアクティビティでpublic static String値を宣言し、1番目のアクティビティで呼び出した場合はshownullである理由を教えてください。

  import android.widget.EditText;
  import android.widget.TextView;
  import android.widget.Toast;

  public class ButtonExample extends Activity
 {
   Button b1;

  String Latitude500;

 public void onCreate(Bundle savedInstanceState)
{
 super.onCreate(savedInstanceState);
 setContentView(R.layout.main);

  b1 = (Button) findViewById(R.id.button1);


 Latitude500=textview.Latitude1nazeer;

 TextView t3 = (TextView) findViewById(R.id.textView2);

t3.setText(""+Latitude500);


 b1.setOnClickListener(new OnClickListener()
 {
 public void onClick(View v)
 {



  Intent intent = new Intent(ButtonExample.this, textview.class);



startActivity(intent);


 }
  });


         public class textview extends Activity {



  public static String Latitude1nazeer;


  EditText Latituden1;

     public void onCreate(Bundle savedInstanceState)
  {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.laymenu);


   Latituden1 = (EditText) findViewById(R.id.editText2);
   String ln = Latituden1.getText().toString();


   Latitude1nazeer=ln;





  }
          }




         <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mypackage"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk android:minSdkVersion="8" />

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >
    <activity
        android:name=".ButtonExample"
        android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
     <activity android:name=".textview" > </activity>   
</application>

 </manifest>
4

5 に答える 5

2

こんなことしないで!これは本当に悪い習慣です。

あなたの質問に対する簡単な答えは、アクティビティ 2 は開始するまで初期化されていないためです。アクティビティは、他のオブジェクトと同様にタイプ Activity のオブジェクトです。アクティビティについて不思議なことは何もありません。ただし、アクティブなアクティビティでない場合、Android はそれらを強制終了する権利を留保します。

どうしても必要な場合を除き、Activity から何かを渡すべきではありません。経験則では、アクティビティよりも長いライフサイクルを持つものは、そのアクティビティ内の何かを参照するべきではありません。そのため、Android には、アクティビティ間のプロセス間通信のためのインテントがあります。

static はアクティビティ A で宣言され、アクティビティ B で参照されるため、アクティビティ B がフォアグラウンドになります。Android はアクティビティ A を破棄できます。もしそうなら、アクティビティ全体と参照を持つすべてのリソースをリークしたことになります。

これにはいくつかの解決策がありますが、私にとっての正解は、デザインを再考することです。あるアクティビティが別のアクティビティの何かに直接アクセスする必要があるのはなぜですか? これを示唆する非常に奇妙なデザインがいくつかあると確信していますが、これを行うための合理的な説明は「通常の」Android開発では考えられません。

考えられる解決策は、私の個人的な好みの正確さの順序です。

  • 文字列の値が変数の場合、バンドル内のアクティビティ間で文字列の値を Intent で渡します。評価 - とてもいいです。
  • 文字列が固定されている場合は、strings.xml に入れます。評価 - 非常に良い。
  • それが真にグローバルである場合 (そしてそれについて真剣に考えている場合)、Application クラスを拡張します。評価 - 何かにおいがする
  • 静的文字列を使用して別のクラスを作成します。評価 - キーボードで長い一日を過ごした後は、足よりも臭いがします。

立ち止まって考えてみてください。また、質問を編集して、何をしようとしているのか、なぜそうしようとしているのかを説明してください。

今のところコードについて心配する必要はありません。最初に適切なソリューションを見つけてから、コードについて心配してください。

[編集] この特定の質問に対する回答の一部よりも、将来の読者の可能性のために。

独自のクラスを作成することを想像してください。そのクラスには、ビューの階層を持つユーザー インターフェイスがあります。UI の見栄えを良くするためのビットマップがいくつかあり、UI に入力する文字列など、あらゆる種類のデータへの参照を保持できます。また、一部のデータ構造に接続するためのアダプターがある場合もあります。他のオブジェクトがこのクラスのインスタンスのデータにアクセスできるように、静的フィールドがあります。

「静的は悪」と「グローバル変数」についての議論は今のところ止めましょう。

このクラスのインスタンスを作成すると、他のオブジェクトがそれを参照し始めます。そのオブジェクトのライフ サイクルを制御し、解放したいときにオブジェクトへの参照を保持できないようにコードを記述できるので、これまでのところ問題ありません。

アプリケーションの外部にある何かがオブジェクトを逆参照し、ガベージ コレクターが使用したメモリを収集できるようにすることで、そのオブジェクトを破壊する可能性があると説明したとします。ガベージ コレクターはオブジェクトを調べて、逆参照されていることを確認します。しかし、ちょっと待ってください。別のオブジェクトが参照している静的クラス レベル フィールドがあります。static は、変数または静的メソッドとしてクラス レベルにある必要があるため、ガベージ コレクターはそのオブジェクトを解放しません。これで、参照できなくなったすべてのメモリを使用してオブジェクトがヒープに置かれました。

上記が安全な解決策だとまだ思いますか?

ここでの重要な点は、活動はまさにそれであるということです。Activity クラスのオブジェクト インスタンスです。しかし、Android では、オブジェクトにはいくつかの特別なプロパティがあります。その 1 つは、Android がコードへのコールバックなしでそのオブジェクトを強制終了できることです。

于 2012-11-15T07:20:20.287 に答える
2

なぜなら、2番目のアクティビティで文字列に値を割り当てる前に、最初のアクティビティで読んでいるからです。だからヌルです。

2番目のアクティビティでこのように宣言しますpublic static String Check="check"

この値を最初のアクティビティで出力します。あなたはこれを知った

于 2012-11-15T07:15:01.500 に答える
0

Android には、メソッド startActivityForResult() によって、あるアクティビティの値を別のアクティビティに取得するためのメソッドが既に用意されています。このリンクはあなたを導くことができます。

于 2012-11-15T07:21:49.190 に答える
0

静的フィールドを使用してアクティビティ間でデータを共有しないでください。静的フィールドは、そのクラスが JVM によってロードされている間のみ存続し、Android はそれについて保証しません。これを行う正しい方法は、データをIntentに入れることです。インテントガイドをお読みください。

于 2012-11-15T07:13:26.607 に答える
0

アプリケーションが再開されたとき、またはユーザーがテキストビューの戻るボタンを押したときにこのメソッドが呼び出されるため、メソッドonResume()を追加しますButtonExample

@Override
public void onResume()
{
    Log.v("Resuming", "onResume");
    t3.setText(""+Latitude500); // set text here
    super.onResume();
}

そして私の好みは、アプリケーションに静的変数を使用しないことですSharedPreferences 。アプリケーションコンポーネント間でデータを共有するために使用またはインテントを使用できます

于 2012-11-15T07:13:52.050 に答える