2016-03-30 10 views
2

私はログインFragmentとクラスCServerResponseというクラスがあります。androidの非アクティビティクラスからフラグメントを呼び出す方法

CServerResponseクラスからLoginFragmentに電話します。

どうすればいいですか?ここで

CServerResponseクラスコードです:

public class CServerResponse { 
    public static CServerResponse s_m_oServerResponse; 
    public Context m_Context; 

    private CServerResponse(Context m_Context) { 
     this.m_Context = m_Context; 
    } 

    public static CServerResponse getInstance() { 
     if (s_m_oServerResponse == null) { 
      s_m_oServerResponse = new CServerResponse(); 
     } 
     return s_m_oServerResponse; 
    } 

    public void getLoginResponse() throws JSONException { 
     final Fragment activity = (Fragment) m_Context; 
     if (CLoginScreen.m_oResponseobject.getString("resultdescription").equalsIgnoreCase("Transaction Successful")) { 

      CLoginScreen.m_oLoginSession.setLoginData(
       CLoginScreen.s_szResponseMobile, CLoginScreen.s_szResponsePassword); 

      getActivity().getSupportFragmentManager() 
         .beginTransaction() 
         .replace(R.id.container, new CDealMainListing()).commit(); 

      CToastMessage.getInstance().showToast(getActivity(), "You are successfully Logged In"); 

     } else if (m_oResponseobject.getString("resultdescription").equalsIgnoreCase("Agentcode Can Not Be Empty")) { 

      CToastMessage.getInstance().showToast(getActivity(), "Please Enter Valid Mobile Number"); 

     } else if (m_oResponseobject.getString("resultdescription").equalsIgnoreCase("Pin Can Not Be Empty")) { 

      CToastMessage.getInstance().showToast(getActivity(), "Please Enter Password"); 

     } else if (m_oResponseobject.getString("resultdescription").equalsIgnoreCase("Invalid PIN")) { 

      CToastMessage.getInstance().showToast(getActivity(), "Please enter correct Password"); 

     } else if (m_oResponseobject.getString("resultdescription").equalsIgnoreCase("Subscriber/Agent Blocked due to Wrong Attempts")) { 

      CToastMessage.getInstance().showToast(getActivity(), "You are blocked as You finished your all attempt"); 

     } else if (m_oResponseobject.getString("resultdescription").equalsIgnoreCase("Connection Not Available")) { 

      CToastMessage.getInstance().showToast(getActivity(), "Connection Lost ! Please Try Again"); 

     } else if (m_oResponseobject.getString("resultdescription").equalsIgnoreCase("Subscriber/Agent Not Found")) { 

      CToastMessage.getInstance().showToast(getActivity(), "User not found ! Kindly Regiter before Login"); 

     } else if (m_oResponseobject.getString("resultdescription").equalsIgnoreCase("OTP not verify")) { 

      CToastMessage.getInstance().showToast(getActivity(), "Otp not Verify ! Kindly Generate Otp on Sign Up"); 
     } 
    } 
} 
+3

が重複する可能性の

AppCompatActivity activity = (AppCompatActivity) context; 

を使用し、[それは活動せずにフラグメントを持つことは可能ですか?](のhttp://のstackoverflow。com/questions/21071682 /アクティビティなしで断片化する可能性があります) – FredMaggiowski

+1

他:http://stackoverflow.com/questions/23731309/fragment-without-activity – FredMaggiowski

答えて

5

あなた」

あなたの流れの断片をこのコードは、あなたにこのアプローチを示していないが、ちょうどあなたが整理(私の愚見で)する方法フラグメントを呼び出す必要があるActivityのコンテキストへのアクセスが必要です。

startLoginFragment(コンテキストコンテキスト)という名前のメソッドでそれぞれのアクティビティのコンテキストがあるとします。次のように、このメソッドのコードは次のようになります。

public void startLoginFragmemt(Context context) { 
    Activity activity = (Activity) context; 
    FragmentManager fragmentManager = activity.getFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    LoginFragment fragment = new LoginFragment(); 
    fragmentTransaction.add(R.id.fragment_container, fragment); 
    fragmentTransaction.commit(); 
} 
1

あなたが活動のうち、フラグメントを作成することができますが、活動に取り付けた場合にのみ、彼らのライフサイクルメソッドが呼び出されるので、あなたは活動の外にそれらを使用するべきではありません。

フラグメント内のデータを操作する場合は、フラグメントクラスを作成できます。それをアクティビティから構築して膨張させ、パブリックメソッドを使用して別のクラスにアクセスして情報を変更します。あなたの状況では

あなたが持つことができます。

  • LoginFragment:LoginFragmentを膨張し、ログインサービスを呼び出す:UI要素
  • LoginActivityを処理するクラス。
  • LoginService:ログインサービス(AsyncTask?)を処理すると、必要な情報がLoginActivityに返され、最終的に情報を処理する部分にアクティビティが更新を送信します。

いくつかのコード..私はコメントで言ったように、このコードは非常に便利ではないかもしれません...すべてはあなたがすべてを処理する方法に依存して...私は個人的に、私が作成するために使用するカスタムインタフェースをAsyncTaskを使用したいですタスクとUIスレッド間のコールバック(UIスレッド間でデータを交換してUI変更をトリガーするために使用)

Class LoginFragment extends Fragment { 

    private PROP1 prop1; 
    private PROP2 prop2; 

    private LoginFragment(){} 

    public static LoginFragment createInstance(PROP1 prop1, PROP2 prop2){ 
     this.prop1 = prop1; 
     this.prop2 = prop2; 
    } 

    // Fragment lifecycle methods 

    // Methods used by activity to trigger changes in UI.. 
    // They could be setters or.. really.. whatever fits best in your flow. 
    public void changeProp1(PROP1 prop1){ 
     this.prop1 = prop1; 
     // EDIT UI ELEMENTS.. DO WHATEVER YOU NEED TO DO.. 
    } 
} 

アクティビティー:

Class LoginActivity extends Activity { // Activity or whatever Activity class you're using. 

    private LoginFragment mLoginFragment; 

    @Override 
    public void onCreate(){ // I don't remember the correct signature 

      // Create LoginFragment 
      mLoginFragmet = LoginFragment.newInstance(prop1,prop2) 
      // Use FragmentManager to inflate your fragment 
    } 

    public void serviceInvoke(){ // I don't remember the correct signature 

      // Invoke your login service. I'd use an AsyncTask and an interface implementation that allows the usage of callbacks 
      // When the service is complete take the result value and pass it to the proper Fragment method 
      mLoginFragment.changeProp1(theResultOfTheService); 
    } 
} 
+0

私に解決策を教えてください? – Nitin

+0

私はあなたが本当に必要としないコードのかなり大きなコピー/ペーストになる可能性があります。いくつかのサンプルで答えを編集しますが、AndroidStudioがあなたに新しいフラグメントクラスファイル。 – FredMaggiowski

+0

あなたの接続を処理するためのAsyncTaskの適切な実装を見てください.FragmentManagerを使用して、あなたのフラグメントをアクティビティで膨らませてください。 – FredMaggiowski

0

あなたがAppCompatActivityを使用している場合は、あなたのcontextに応じてそれ以外の場合は、あなたがIllegelは例外を投げてしまいますをキャスト。だからではなく、単純なactivity

Activity activity = (Activity) context; 
関連する問題