2016-03-30 62 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

的可能的複製(HTTP [是否有可能有一個碎片,無活動?]://計算器。com/questions/21071682/is-it-it-it-it-a-fragment-without-an-activity) – FredMaggiowski

+1

另請參閱:http://stackoverflow.com/questions/23731309/fragment-without-activity – FredMaggiowski

回答

5

你」需要訪問需要調用片段的Activity的上下文。

讓我們假設你有一個名爲startLoginFragment(Context context)的方法中相應Activity的上下文。此方法的代碼如下:

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

您可以創建片段流出活動,但你不應該的活動之外使用它們,因爲它們的生命週期方法連接到活動時才被調用。

如果你想操縱Fragment中的數據,你可以創建一個Fragment類。從一個Activity中構建並擴充它,然後使用公共方法從另一個類訪問它以修改信息。

在你的情況,你可以有:

  • LoginFragment:類處理UI元素
  • LoginActivity:其膨脹的LoginFragment並調用登錄服務。
  • LoginService:它處理登錄服務(AsyncTask?),當它完成時,它返回到LoginActivity所需的信息,Activity將更新發送到最終將處理信息的Fragment。

一些代碼..正如我在評論中說,這個代碼可能不是非常有用的。一切取決於你如何處理所有的事情......我個人喜歡用的AsyncTask與我使用它來創建自定義界面任務和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轉換異常。因此,使用

AppCompatActivity activity = (AppCompatActivity) context; 

,而不是簡單的activity

Activity activity = (Activity) context; 
相關問題