2012-05-26 16 views
40

フラグメント内のボタンをクリックしたときにトーストメッセージを表示しようとしています。問題は、トーストを表示するためにアクティビティにアクセスできないことです。フラグメント内のトーストを使用

はここFragmentのソースです:

public class FrgTimes extends Fragment 
    { 
     ScrollView sv; 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
       Bundle savedInstanceState) 
     { 
      if (container == null) { return null; } 

      sv = (ScrollView)inflater.inflate(R.layout.frg_times, container, false); 

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

      //****** HERE's the PROBLEM ******** 
      Toast.makeText(<The Activity>, "Please long press the key", Toast.LENGTH_LONG); 

      }}); 

      return sv; 
     } 

とここで私が試みられてきたものです。

Toast.makeText(getActivity() , ... 
Toast.makeText(getView().getContext() , ... 
Toast.makeText(getActivity().getApplicationContext() , ... 
Toast.makeText(sv.getContext() , ... 
Toast.makeText(sv.getRootView().getContext() , ... 

デバッグでは、私はこれらのコードの全てが例外なしで実行するが、何のTOASTが表示されないされていることがわかります。

答えて

91

作成するToastshow()は、makeText()で呼び出していません。

+21

この小さな** SHOW' **は私の3時間以上を要します。ありがとう、今はすべて美しいようです。 – mammadalius

+5

これは私の標準的なエラーです。良いことに、LintはSDK20の時点でこのエラーを検出しています。 –

+0

STupid私..Thatsは私の間違いだった..私didnotコールショー() – John

17

私も同じ問題で他の人々を助けるために、フラグメント内で使用トーストに 完全な答えは次のとおりです。

Activity activity = getActivity(); 

@Override 
public void onClick(View arg0) { 

    Toast.makeText(activity,"Text!",Toast.LENGTH_SHORT).show(); 
} 
41

alfo888_ibgで述べたように:

@Override 
public void onClick(View arg0) { 
    Toast.makeText(activity,"Text!",Toast.LENGTH_SHORT).show(); 
} 

ちょうど行います

Toast.makeText(getActivity(),"Text!",Toast.LENGTH_SHORT).show(); 

これは私のために働いた。

0

user2564789はそれが正しい
言った。しかし、あなたはまた、次のようにしてくださいフラグメントで乾杯をするとき、あなたのトーストがこの


    Toast.makeText(this,"Message",Toast.LENGTH_SHORT).show(); 

10

のように見えるようになりますgetActivity()
の代わりにthisを使用することができます。

Toast.makeText(getActivity(),"Message", Toast.LENGTH_SHORT).show();

クラスが拡張フラグメントである場合、使用する必要がありますgetAcフラグメントはサブクラスのアクティビティであるため、tivity()です。

Cheerse

+3

フラグメントはObjectのサブクラスで、http://developer.android.com/reference/android/app/Fragment.htmlをチェックします。アクティビティのサブクラスの場合は、代わりに – chairam

1

アンドロイドフラグメント内のトーストを呼び出す:

1. Activity mActivity=this.getActivity(); 

2. Toast.makeText(mActivity,"Text you want to display",Toast.LENGTH_SHORT).show(); 

これは私のために動作します。

+0

を使用できます'Toast'の終了後に' show() 'メソッドを呼び出さないでください。シンプルにこれをコメントすることができます。 –

-1
 public void onClick(View v) { 
      Context context = v.getContext(); 
      CharSequence text = "Message"; 
      int duration = Toast.LENGTH_SHORT; 
      Toast toast = Toast.makeText(context, text, duration); 
      toast.show(); 
     } 
4

作るフラグメント内のトースト

Toast.makeText(getActivity(), "Your Text Here!", Toast.LENGTH_SHORT).show(); 

OR

Activity activityObj = this.getActivity(); 

    Toast.makeText(activityObj, "Your Text Here!", Toast.LENGTH_SHORT).show(); 

OR

Toast.makeText(this, "Your Text Here!", Toast.LENGTH_SHORT).show(); 
1

あなたはgetActivityと現在の活動を得ることができます()

Toast.makeText(getActivity(),"Toast your message" ,Toast.LENGTH_SHORT).show(); 
0

こんにちは私はいくつかのユーザーが既に質問に答えているのを見ました。それでも、私はこの情報がアンドロイドプログラマーにとって有益だと思う。

あなたのAPI応答にはgetActivity()またはgetContext()を使用しないでください。 APIの応答が来る前にフラグメントが置換されている場合はいつでもnullになる可能性があります。

とエラー

java.lang.IllegalStateException: Fragment MyFragment{410f6060} not attached to Activity

は、代わりにトーストを表示するには、Applicationクラスを使用しています。

public class ApplicationContext extends Application { 

/** Instance of the current application. */ 
private static ApplicationContext instance; 

/** 
* Constructor. 
*/ 
public ApplicationContext() { 
    instance = this; 
} 

/** 
* Gets the application context. 
* 
* @return the application context 
*/ 
public static Context getContext() { 
    if (instance == null) { 
     instance = new ApplicationContext(); 
    } 
    return instance; 
} 

/** 
    * display toast message 
    * 
    * @param data 
    */ 
    public static void showToast(String data) { 
     Toast.makeText(getContext(), data, 
       Toast.LENGTH_SHORT).show(); 
    } 

} 

ようにあなたは、あなたがbase classを作成し、あなたのすべての断片でそれを拡張することができますフラグメントにActivity instanceが必要な場合。

public class BaseProjectFragment extends Fragment 

    private BaseProject baseProject; 

    public BaseProject getBaseProject() { 
     if (baseProject == null) baseProject = (BaseProject) getBaseProject(); 
     return baseProject; 
    } 

    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 
     if (context instanceof BaseProject) { 
      baseProject = (BaseProject) context; 
     } 
    } 

getBaseProject()の代わりgetActivity()を使用しています。それは決してあなたに与えることはありませんnull

関連する問題