2016-03-25 11 views
0

私はアクティビティから別のアクティビティにメソッドを呼び出す必要があります。私のFirstClassがある:別のアクティビティでメソッドを呼び出す方法

public class firstclass extends Activity { 
    public String Kind(){ 
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); 
    boolean Key = preferences.getBoolean("Key", true); 
    if(Key){ 
     name="you"; 
    } 
    else{ 
     name="me"; 
    } 
    return name; 
    } 
} 

secondclassは次のとおりです。

public class secondclass extends Activity { 
    public void take(String token, int transactionId) { 
     firstclass first = new firstclass(); //error in this class 
     first.Kind(); 
    } 
} 

私のエラーは、次のとおりです。要するに

03-25 19:05:39.082 5421-5487/com.example.com E/AndroidRuntime﹕ FATAL   EXCEPTION: pool-5-thread-1 
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
     at android.os.Handler.<init>(Handler.java:197) 
     at android.os.Handler.<init>(Handler.java:111) 
     at android.app.Activity.<init>(Activity.java:759) 
     at com.example.com.firstclass<init>(firstclass.java:17) 
     at com.example.com.secondclass(secondclass.java:157) 
+0

Kind()メソッド実装コードを貼り付けてください。 –

+0

別のクラスのメソッドを使用するには、静的にし、 "firstclass.Kind()"とタイプして呼び出す必要があります。 "firstclass"を初期化してメソッド –

+0

を呼び出す必要はありません。 SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);これを静的に "this"を知ることができないようにします。 – Tom

答えて

0

:あなたはいけません。両方のアクティビティがアクセスできるロジック(kind())を処理する別の(シングルトン)クラスを作成します。

+0

アクティビティが出て行く可能性があるので、アクティビティコンテキストをシングルトンクラスに渡すと、潜在的なメモリリークが発生しますか? –

+0

第1オフ:あなたがコア機能を混乱させない限り、Android sdkはアクティビティの破壊と構築を処理します。 Second:アクティビティのコンテキストをシングルトンクラスに渡す必要はありません。ただ1組の変数が格納を処理します。これはここで説明されています:http://stackoverflow.com/questions/2614719/how-do-i-get-the-sharedpreferences-from-a-preferenceactivity-in-android特定のアクティビティに保存された設定が本当に必要な場合は、あなたの一般的なデザインを再考したいかもしれません=) –

0

アクティビティ間で共有する必要のあるコードがある場合は、そのアクティビティをヘルパークラスにエクスポートする必要があります。

例:

public class KindUtils { 
    public static String Kind(Context context){ 
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); 
    boolean Key = preferences.getBoolean("Key", true); 
    if(Key){ 
     name="you"; 
    } 
    else{ 
     name="me"; 
    } 
    return name; 
    } 
} 

今、あなたは、両方のactivitesでKindUtils.Kind(this)を呼び出すことができます。

+0

'this'はヘルパークラスのどこから来たのですか?あなたは文脈を渡す必要があります... –

+0

ヘッドアップのおかげで – F43nd1r

0

これはあなたのやり方ではありません。私の知識に従ってコードを修正しましょう。

  1. 常に常にメソッド名のキャメルケースを使用し
  2. クラス名は大文字で開始する必要があることをそのJavaクラスの命名規則を確認して、小さなキャップで始まります。
  3. アクティビティを拡張するクラスにキーワードnewを使用することはできません。

は今、どのようにあなたがアンドロイドで、他のクラスからメソッドにアクセスする方法を説明しますいくつかの活動

((Firstclass)getActivity()).kind; 

から他のアクティビティのメソッドにアクセスすることができます。あなたは

public class Secondclass extends Activity { 
    public void take(String token, int transactionId) { 
     String str= ((Firstclass)getActivity()).kind; 
    } 
} 

が、それはあなたが非UIからのUI(ユーザーインターフェース)メソッドを呼び出したときに、すべてのルーパー・エラーの

+0

いいえいいえ。これは、インスタンスからフィールドを読み取る方法ですが、すでにインスタンスを持っている必要があります。そうでない場合、インスタンスは動作しません。また、フィールドではなくメソッドを要求します。あなたは命名規則に関して良い点を持っています。 – F43nd1r

0

まず問題が発生するのに役立ちます願ってやる第二のクラスで

public class Firstclass extends Activity { 
    public String kind(){ 
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); 
    boolean Key = preferences.getBoolean("Key", true); 
    if(Key){ 
     name="you"; 
    } 
    else{ 
     name="me"; 
    } 
    return name; 
    } 
} 

糸。この場合、2番目のアクティビティが意図として開始されていないため、新しいfirstClass()として悪いことが起こります。 Activitysにライフサイクルコールバックがあります。 onCreateは、どのアイテムが描画されるべきかをリフレクションに渡すために使用されます。通常は、少なくともsetContentView(R.layout.activity_main)のレイアウトへの参照であり、onStartは描画を開始することです。 Androidは多くの画面サイズをサポートしているため、アクティビティに何を入れたいか、アンドロイドの数値と数字を表示してから表示する方法を尋ねる必要があります。主なものは、アクティビティをインテントとして開始し、リンクを読むことです。マニフェストアクティビティブロックにはランチャーがあります。これはアイコンがクリックされたときにアクティビティを開始するためのアイコンをディスプレイに表示することを意味します。アクティビティをインテントとして開始する特別な方法。

0

Javaの場合と同じように、AndroidのインスタンスActivitiesをインスタンス化しないでください。 Intentsを作成し、startActivity()に電話する必要があります。ロジックを機能させるために、BroadcastReceiversを使用することをお勧めします。

関連する問題