2016-07-18 64 views
0

我有一个活动(RecoveryActivity),它有一个片段(RecoveryFragment)。点击按钮会调用显示RecoveryFragment的此活动。我只是想直接调用RecoveryFragment作为一项活动。如何将这个片段转换成一个活动。 Noob在这里!任何帮助将深表感谢。将片段转换为活动

RecoveryActivity

public class RecoveryActivity extends ActivityBase { 

private static final String TAG = "password_recovery_activity"; 

Toolbar mToolbar; 

Fragment fragment; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_recovery); 

    mToolbar = (Toolbar) findViewById(R.id.toolbar); 

    setSupportActionBar(mToolbar); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    getSupportActionBar().setHomeButtonEnabled(true); 

    if (savedInstanceState != null) { 

     fragment = getSupportFragmentManager().getFragment(savedInstanceState, "currentFragment"); 

    } else { 

     fragment = new RecoveryFragment(); 
    } 

    FragmentManager fragmentManager = getSupportFragmentManager(); 
    fragmentManager.beginTransaction().replace(R.id.container_body, fragment).commit(); 
} 

@Override 
protected void onSaveInstanceState(Bundle outState) { 

    super.onSaveInstanceState(outState); 

    getSupportFragmentManager().putFragment(outState, "currentFragment", fragment); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

    super.onActivityResult(requestCode, resultCode, data); 

    fragment.onActivityResult(requestCode, resultCode, data); 
} 

@Override 
public void onBackPressed(){ 

    finish(); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 

    switch (item.getItemId()) { 

     case android.R.id.home: { 

      finish(); 
      return true; 
     } 

     default: { 

      return super.onOptionsItemSelected(item); 
     } 
    }}} 

RecoveryFragment

public class RecoveryFragment extends Fragment implements Constants { 

private ProgressDialog pDialog; 

Button mContinueBtn; 
EditText mEmail; 
String email; 

private Boolean loading = false; 

public RecoveryFragment() { 
    // Required empty public constructor 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 

    setRetainInstance(true); 

    initpDialog(); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    View rootView = inflater.inflate(R.layout.fragment_recovery, container, false); 

    if (loading) { 

     showpDialog(); 
    } 

    mEmail = (EditText) rootView.findViewById(R.id.PasswordRecoveryEmail); 

    mContinueBtn = (Button) rootView.findViewById(R.id.PasswordRecoveryBtn); 

    mContinueBtn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      email = mEmail.getText().toString(); 

      if (!App.getInstance().isConnected()) { 

       Toast.makeText(getActivity(), R.string.msg_network_error, Toast.LENGTH_SHORT).show(); 

      } else { 

       Helper helper = new Helper(); 

       if (helper.isValidEmail(email)) { 

        recovery(); 

       } else { 

        Toast.makeText(getActivity(), getText(R.string.error_email), Toast.LENGTH_SHORT).show(); 
       } 
      } 
     } 
    }); 


    // Inflate the layout for this fragment 
    return rootView; 
} 

public void onDestroyView() { 

    super.onDestroyView(); 

    hidepDialog(); 
} 

protected void initpDialog() { 

    pDialog = new ProgressDialog(getActivity()); 
    pDialog.setMessage(getString(R.string.msg_loading)); 
    pDialog.setCancelable(false); 
} 

protected void showpDialog() { 

    if (!pDialog.isShowing()) pDialog.show(); 
} 

protected void hidepDialog() { 

    if (pDialog.isShowing()) pDialog.dismiss(); 
} 

@Override 
public void onSaveInstanceState(Bundle outState) { 

    super.onSaveInstanceState(outState); 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 

    super.onActivityResult(requestCode, resultCode, data); 
} 

public void recovery() { 

    loading = true; 

    showpDialog(); 

    CustomRequest jsonReq = new CustomRequest(Request.Method.POST, METHOD_ACCOUNT_RECOVERY, null, 
      new Response.Listener<JSONObject>() { 
       @Override 
       public void onResponse(JSONObject response) { 

        try { 

         if (!response.getBoolean("error")) { 


          Toast.makeText(getActivity(), getText(R.string.msg_password_reset_link_sent), Toast.LENGTH_SHORT).show(); 
          getActivity().finish(); 

         } else { 

          Toast.makeText(getActivity(), getText(R.string.msg_no_such_user_in_bd), Toast.LENGTH_SHORT).show(); 
         } 

        } catch (JSONException e) { 

         e.printStackTrace(); 

        } finally { 

         loading = false; 

         hidepDialog(); 
        } 

       } 
      }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 

      loading = false; 

      hidepDialog(); 

      Toast.makeText(getActivity(), getText(R.string.error_data_loading), Toast.LENGTH_LONG).show(); 
     } 
    }) { 

     @Override 
     protected Map<String, String> getParams() { 
      Map<String, String> params = new HashMap<String, String>(); 
      params.put("clientId", CLIENT_ID); 
      params.put("email", email); 

      return params; 
     } 
    }; 

    App.getInstance().addToRequestQueue(jsonReq); 
} 

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
} 

@Override 
public void onDetach() { 
    super.onDetach(); 
}} 
+0

为什么要将片段转换为活动?使用Fragment,这是一个很好的做法。但是您可以直接将fragment_recovery布局添加到您的活动中。使用标记直接在container_body布局中包含布局 – USKMobility

回答

0

可通过扩展而不是片段AppCompatActivity开始

public class RecoveryActivity extends AppCompatActivity(这是你的片段,但我给它改名RecoveryActivity。你不应该因为你'd有两个同名的活动。我们说它叫做RecoveryActivityNew。下面的说明不适合你命名为RecoveryActivity,但是用于RecoveryFragment的一段代码。

然后,您删除仅与片段相关的onAttach()和onDetach()等方法。摆脱onDestroyView。删除onCreateView()和所有在那里的代码,把它的onCreate()

现在,因为你没有一个片段,你引用一个观点是这样的:

mContinueBtn = (Button) findViewById(R.id.PasswordRecoveryBtn);

刚就像你在活动中引用工具栏一样(你失去了rootView)。

此外,在显示吐司例如,您不使用getActivity()方法,但使用thisRecoveryActivity.this

Toast.makeText(RecoveryActivity.this, R.string.msg_network_error, Toast.LENGTH_SHORT).show();

摆脱构造public RecoveryFragment()

和唐的别忘了在应用程序的清单文件中声明新的活动。

<activity 
     android:name=".RecoveryActivity" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" 
    android:screenOrientation="portrait"> 
    <intent-filter> 
     <action android:name="com.your.packagename.RecoveryActivity" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
    </intent-filter> 
</activity> 
+0

是的,我试着按照你所说的去做这样的事情,但是我想我会犯一些错误。我也在清单中宣布它。如果你能告诉我如何在上面的代码中做到这一点,这将是非常有帮助的。学习机器人并没有得到太多你上面所说的。我会感激 –