2011-11-26 10 views
127

Activityには3 EditTextがあり、特殊なキーボードを使ってEditTextに情報を追加するカスタムビューがあります。Android get hostingビューからのアクティビティ

現在、Activityをビューに渡しているので、現在フォーカスのある編集テキストを取得してカスタムキーボードから内容を更新できます。

親アクティビティを参照して、アクティビティをビューに渡さずに現在フォーカスされているEditTextを取得する方法はありますか?

+5

正解はゴミノです。 – djunod

答えて

152

次の方法は、あなたの

  1. Activity host = (Activity) view.getContext()を助けるかもしれません。そして
  2. view.isFocused()
+25

あなたのビューがアクティビティコンテキストから呼び出されない場合、 'getContext()'が常にActivityオブジェクトを返すとは限りません。これを先に計画し、適切なフォールバックを提供するようにしてください。 –

+1

@WordPressDeveloper - アクティビティなしでビューを作成するにはどうすればいいですか?あなたはリモートビューを意味しますか?アクティビティの外で作成されたビューの他のケースはありますか? –

+1

@kilaka Widgets、Fragments、RemoteViews、LayoutInflatersはすべて、アクティビティに関連付けられていないビューを作成する場合があります。 –

195

は、私はちょうどofficial support libraryにMediaRouterからそのソースコードを引っ張られ、これまでのところ、それが正常に動作します:アンドロイドで

private Activity getActivity() { 
    Context context = getContext(); 
    while (context instanceof ContextWrapper) { 
     if (context instanceof Activity) { 
      return (Activity)context; 
     } 
     context = ((ContextWrapper)context).getBaseContext(); 
    } 
    return null; 
} 
+5

?どうして? –

+2

これは、アクティビティが見つかるまで、すべての基本コンテキストをバブルアップするか、ルートコンテキストが見つかったときにループを終了する方法です。ルートコンテキストがnullのbaseContextを持ち、ループの終わりに至るためです。 – Gomino

+10

これはもっと良い方法です。それは答えとしてマークする必要があります。 – shadox

0

7+ビューが囲むへのアクセス権を持っていませんもうアクティビティにキャストすることはできません。view.getContext()アクティビティにキャストすることはできません。

代わりに、以下のコードは、Android 7+と6で動作します:

private static Activity getActivity(final View view) { 
    return (Activity) view.findViewById(android.R.id.content).getContext(); 
} 
1

私はGominoさんanswerを取り、いつでもどこでも私は必要なので、私はそれを使用することができますmyUtils.javaに完璧にフィットするためにそれを修正。誰かが助けてくれることを願っています:)

abstract class myUtils { 
    public static Activity getActivity(View view) { 
     Context context = view.getContext(); 
     while (context instanceof ContextWrapper) { 
      if (context instanceof Activity) { 
       return (Activity)context; 
      } 
      context = ((ContextWrapper)context).getBaseContext(); 
     } 
     return null; 
    } 
} 
関連する問題