2012-02-04 12 views
8

私はアンドロイドのActivityコンストラクタにパラメータを渡すことはできませんが、その理由を理解したいと思います。私が実行しようとしました何なぜAndroidアクティビティコンストラクタにパラメータを渡すことができないのですか

は次のとおりです。

CalorieSelectorActivity csa = new CalorieSelectorActivity(userName); 
       Intent i = new Intent(thisContext, csa.getClass()); 
       startActivity(i); 

次のように私はクラスを定義しています

public class CalorieSelectorActivity extends Activity { 

public CalorieSelectorActivity(String name) { 
    super(); 

} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.calorieselector); 

} 
} 

を私はコンストラクタからパラメータを削除すると、それは完璧に動作します。 私は最終的にintent.putExtraを使用してそれを行いましたが、なぜパラメータをコンストラクタに渡すことでこれを行うことができないのか不思議です。

LogCat

02-04 06:46:52.257: W/dalvikvm(800): threadid=1: thread exiting with uncaught exception (group=0x4001d800) 
02-04 06:46:52.277: E/AndroidRuntime(800): FATAL EXCEPTION: main 
02-04 06:46:52.277: E/AndroidRuntime(800): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.manarbushnaq.calorietracker/com.manarbushnaq.calorietracker.CalorieSelectorActivity}: java.lang.InstantiationException: com.manarbushnaq.calorietracker.CalorieSelectorActivity 
02-04 06:46:52.277: E/AndroidRuntime(800): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2585) 
02-04 06:46:52.277: E/AndroidRuntime(800): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
02-04 06:46:52.277: E/AndroidRuntime(800): at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
02-04 06:46:52.277: E/AndroidRuntime(800): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
02-04 06:46:52.277: E/AndroidRuntime(800): at android.os.Handler.dispatchMessage(Handler.java:99) 
02-04 06:46:52.277: E/AndroidRuntime(800): at android.os.Looper.loop(Looper.java:123) 
02-04 06:46:52.277: E/AndroidRuntime(800): at android.app.ActivityThread.main(ActivityThread.java:4627) 
02-04 06:46:52.277: E/AndroidRuntime(800): at java.lang.reflect.Method.invokeNative(Native Method) 
02-04 06:46:52.277: E/AndroidRuntime(800): at java.lang.reflect.Method.invoke(Method.java:521) 
02-04 06:46:52.277: E/AndroidRuntime(800): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
02-04 06:46:52.277: E/AndroidRuntime(800): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
02-04 06:46:52.277: E/AndroidRuntime(800): at dalvik.system.NativeStart.main(Native Method) 
02-04 06:46:52.277: E/AndroidRuntime(800): Caused by: java.lang.InstantiationException: com.manarbushnaq.calorietracker.CalorieSelectorActivity 
02-04 06:46:52.277: E/AndroidRuntime(800): at java.lang.Class.newInstanceImpl(Native Method) 
02-04 06:46:52.277: E/AndroidRuntime(800): at java.lang.Class.newInstance(Class.java:1429) 
02-04 06:46:52.277: E/AndroidRuntime(800): at android.app.Instrumentation.newActivity(Instrumentation.java:1021) 
02-04 06:46:52.277: E/AndroidRuntime(800): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2577) 
02-04 06:46:52.277: E/AndroidRuntime(800): ... 11 more 
+0

btw、エラー内容を確認できますか?ペーストビンまたは要点 – DallaRosa

+1

私はそれをする方法の手がかりを持っていないでしょう。 LogCatを投稿することはできますか? @DallaRosa –

+0

あなたの質問を最初に読んだときに私が見たことのない情報を反映するように答えを更新しました。 – DallaRosa

答えて

17

はあなたのコードを参照してください:

CalorieSelectorActivity csa = new CalorieSelectorActivity(userName); 

Intent i = new Intent(thisContext, csa.getClass()); 

startActivity(i); 

あなたがあなたの活動のオブジェクトを作成する場合でも、あなたはインテントオブジェクトに「合格」していることactivity objectちょうどclass of your activityではありません。 startActivity()では、Androidフレームワークはあなたの活動のオブジェクトをインスタンス化しようとします。そして、それを行うときに、デフォルトのコンストラクタ(パラメータなし)を呼び出します。あなたのクラスがパラメータのないコンストラクタを持っていないときは失敗します。

もちろん、正しい解決策を見つけたら、そのパラメータをインテントオブジェクトの一部として渡します。

+0

私は最初にそれをやろうとしていました。私はそれを使用する必要があったため、カスタムオブジェクトをアクティビティクラスに渡すことができますが、失敗した場合は単純な文字列を試しました。私の質問に示すように。 @ Sameer –

+0

そして、私のクラス宣言に引数があり、私が定義するオブジェクト "csa"はそのクラスに基づいていますか? AndroidがデフォルトのActivityコンストラクタを直ちに呼び出すのではなく、そのクラスコンストラクタ(最終的にはデフォルトのActivityコンストラクタを呼び出す)を呼び出そうとしてはいけません。私は非常に奇妙な行動を見つける。 @DallaRosa –

+2

私はAndroidのフレームワークがどのように実装されているのか、本当に専門家ではありません。ただし、ここで理解することは、フレームワークがリフレクションを使用してアクティビティのオブジェクトをインスタンス化することです。作成したオブジェクトはフレームワークで使用されていません。私はあなたにJavaのリフレクションをお読みになることをお勧めします。それは奇妙に見えないかもしれません。 – Sameer

0

あなたはコンストラクタを試してみて、呼び出すときにどのようなエラーが出るのですか?アクティビティの新しいインスタンスに値を渡すには、その構築を呼び出します。それはあなたの問題を解決するかもしれないし、解決しないかもしれませんが、コンストラクタに@overrideを付けるとどうなりますか?

これは、アクティビティがメモリを解放するために一時停止されている場合、それらの値がシステムによって復元できるため、実際にBundlesまたはintent.putメソッドを使用してデータを利用できるようにする必要があると述べました。

+0

私が得ているエラーは: –

+0

私は次のエラーが発生しています: 02-04 03:39:58.297:E/AndroidRuntime(713):java.lang.RuntimeException:アクティビティのインスタンス化ができませんComponentInfo {com.manarbushnaq。 calorietracker/com.manarbushnaq.calorietracker.CalorietSelectorActivity}:java.lang.InstantiationException:com.manarbushnaq.calorietracker.CalorieSelectorActivity 私は構造体を使っていませんでしたので、私はsuper()を呼び出しています。前に言ったように、パラメータなしで同じコードを使用するとうまく動作します。それはアクティビティを除く他のすべてのクラスで動作します!!! –

0

コンストラクタを持つActivityを実際に作成する必要がある場合(たとえば、Taskerプラグインの編集アクティビティなど、別のアプリケーションによって起動されるActivityを作成しているため)、それを行うことができますように、派生クラスを使用して:あなたは、パラメータを生成する必要がある場合

class BaseActivity extends Activity 
{ 
    public BaseActivity(String parameter) 
    { 
     // Do something with parameter 
    } 
} 

class DerivedActivity extends BaseActivity 
{ 
    public DerivedActivity() 
    { 
     super("parameter"); 
    } 
} 

を、適切な値を返す関数呼び出しで"parameter"を交換してください。

+1

これは「ハードコードされたパラメータ」です。 –

関連する問題