0

だから、私は基本的にある種のログインフォームをいじって、今後のアクティビティでユーザー名を使ってカスタマイズされた挨拶をしようとしています。コードは問題なくコンパイルされますが、ログイン ボタンをクリックするとすぐにアプリがクラッシュします。カスタマイズされた hello を実装しようとする前にログインが正常に機能していたため、問題は次のコードのどこかにあるはずです。

ここでアクティビティを呼び出します。

Intent k = new Intent(this, MainActivity.class);
            //Sends login name to activity k
            k.putExtra("loginName", login.getText().toString()); 
 //login is the EditText variable name for the login text field
            startActivity(k);

ここで、余分なデータを取得し、説明どおりに使用しようとします。

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class ProfileActivity extends Activity {

    TextView helloString;

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.home);
        Bundle extras = getIntent().getExtras();

        //Getting the hello text string
        helloString = (TextView)findViewById(R.id.textHello);
        String loginName = extras.getString("loginName");
        helloString.setText("¡Hello, " + loginName + "!");

    }

}

次の 2 行をコメントにすると、どうにかしてクラッシュを回避できます。

String loginName = extras.getString("loginName");
helloString.setText("¡Hello, " + loginName + "!");

それでも、問題が本当に存在するかどうかはわかりません。最初のアクティビティから送信されたデータのタイプが 2 番目に取得されるタイプと一致しないことに関係があるのではないかと考えましたが、まだ何も得られませんでしたその周りでいくつかのことを試した後の手がかり。

前もって感謝します。

編集:

テキストが profileActivity.class というアクティビティに表示されている間に mainActivity.class を呼び出しているという事実に関係がある可能性があることが実際にわかりました。問題は、profileActivity が mainActivity 内のタブとして表示されていることです。そのため、どのようにアプローチすればよいかよくわかりません。

編集 2:

だから私は最終的にそれを自分で解決しました。興味のある人のために、データを MainActivity.class に送信しました

Intent k = new Intent(this, MainActivity.class);

            //Sends login name to activity k
            k.putExtra("loginName", login.getText().toString());
            startActivity(k);

また、メイン アクティビティ内で、ProfileActivity を呼び出してタブとして設定する場合:

//Profile tab
            intent = new Intent(this, ProfileActivity.class);
            Bundle extras = getIntent().getExtras();
            intent.putExtra("loginName", extras.getString("loginName"));
            spec = mTabHost.newTabSpec("home")
                    .setIndicator("Home", res.getDrawable(R.drawable.profile_icon))
                    .setContent(intent);
            mTabHost.addTab(spec);

問題は解決しました。とにかく、みんなの助けに感謝します。

4

3 に答える 3

1

あなたの意図は MainACtivity.class を参照しており、ProfileActivity でエクストラを取得しようとしています。それがあなたのフローである場合は、MainActivity.class を ProfileActivity.class に変更してみてください。アクティビティ フローをクロスチェックしてください。

それが役に立てば幸い。

Intent k = new Intent(this, ProfileActivity.class);
            //Sends login name to activity k
            k.putExtra("loginName", login.getText().toString()); 
 //login is the EditText variable name for the login text field
            startActivity(k);
于 2012-04-16T19:26:07.140 に答える
0

データを ProfileActivity に送信したいが、MainActivity を開く必要があると述べたので、4 つのアプローチのいずれかに従うことができます。

注: getExtra を使用するときは、戻り値が null でないことを確認し、それに応じて処理する必要があります。

  1. 最初にデータを MainActivity に送信し、次に MainActivity から ProfileActivity を起動するときに、以前に渡されたデータを送信します。
  2. ProfileActivity の public static フィールドにデータを入れます。public static 変数は問題を引き起こす可能性があるため、これはお勧めしません。
  3. データを sharedPreferences ファイルに保存し、必要なときに ProfileActivity で読み取ります。
  4. SubClass Application であり、そこで多くの変数を設定/アクセスできます。以下は、アクティビティ クラスの静的フィールドは、作成/破棄サイクルを超えることが保証されていますか?からコピーされたものです。:

    public class MyApplication extends Application{ private String thing = null;

        public String getThing(){
            return thing;
        }
    
        public void setThing( String thing ){
            this.thing = thing;
        }
    }
    
    public class MyActivity extends Activity {
        private MyApplication app;
    
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            app = ((MyApplication)getApplication());
    
            String thing = app.getThing();
        }
    }
    
于 2012-04-16T20:00:24.500 に答える
0

MainActivity で:

String user = this.getIntent().getStringExtra("loginName");

MainActivity でタブホストを作成するときは、同じ方法で文字列を渡します。

Intent intent = new Intent().setClass(this, ProfileActivity.class);
intent.putExtra("loginName", user);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
// Initialize a TabSpec for each tab and add it to the TabHost
spec = mTabHost.newTabSpec("profile").setIndicator("Profile").setContent(intent);
mTabHost.addTab(spec);

このようなもの。

ただし、アプリケーション全体でユーザー名が必要な場合は、ヘルパー クラスを使用してユーザー名を保存します。

于 2012-04-16T20:11:43.003 に答える