应用使用“活动”正在正常运行。现在我将相同的代码从“活动”移动到“片段”。所有视图,例如TextView,都在Activity 1的updateUI()方法上,然后将其移动到Fragment中的onCreateView。更改为分割应用程序不再提交,当您单击提交按钮时,它会不断旋转/缓冲。我已尽力而为,但我没有成功。下面是我的片段代码。
公共类BronzeFragment扩展Fragment实现View.OnClickListener {
EditText nameField, surnameField, emailField, yourPhoneField,eventsDurationField,numberOfGuestsField, addressField,
specifyField, additionalDetailsField;
CheckBox mrField, mrsField, missField, friendField,youtubeField,websiteField,vimeoField,internetField,
googleField,otherField, lodgeGuestHouseField, gardenWeddingField, corporateEventField,
partyField, photoShootField, otherServiceField;
AwesomeValidation awesomeValidation;
Button buttonAddItem;
//these two are for the DatePickerDialog popup to your android app
private TextView mDisplayDate;
private DatePickerDialog.OnDateSetListener mDateSetListener;
public BronzeFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.bronze_fragment, container, false);
// getting the views using the rootView
nameField = (EditText)rootView.findViewById(R.id.Name_field);
surnameField = (EditText)rootView.findViewById(R.id.surname_field);
emailField = (EditText)rootView.findViewById(R.id.email_field);
yourPhoneField = (EditText)rootView.findViewById(R.id.Phone_field);
mDisplayDate = (EditText)rootView.findViewById(R.id.choose_event_date);
eventsDurationField = (EditText)rootView.findViewById(R.id.event_duration);
numberOfGuestsField = (EditText)rootView.findViewById(R.id.number_of_guests);
addressField = (EditText)rootView.findViewById(R.id.address_field);
mrField = (CheckBox)rootView.findViewById(R.id.mr_field);
mrsField = (CheckBox)rootView.findViewById(R.id.mrs_field);
missField = (CheckBox)rootView.findViewById(R.id.miss_field);
friendField = (CheckBox)rootView.findViewById(R.id.friend);
youtubeField = (CheckBox)rootView.findViewById(R.id.youtube);
websiteField = (CheckBox)rootView.findViewById(R.id.website);
vimeoField = (CheckBox)rootView.findViewById(R.id.vimeo);
internetField = (CheckBox)rootView.findViewById(R.id.internet);
googleField = (CheckBox)rootView.findViewById(R.id.google);
otherField = (CheckBox)rootView.findViewById(R.id.other);
specifyField = (EditText)rootView.findViewById(R.id.specify);
lodgeGuestHouseField = (CheckBox)rootView.findViewById(R.id.lodge_guest_house);
gardenWeddingField = (CheckBox)rootView.findViewById(R.id.garden_wedding);
corporateEventField = (CheckBox)rootView.findViewById(R.id.corporate_event);
partyField = (CheckBox)rootView.findViewById(R.id.party);
photoShootField = (CheckBox)rootView.findViewById(R.id.photo_shoot);
otherServiceField = (CheckBox)rootView.findViewById(R.id.other_service);
additionalDetailsField = (EditText)rootView.findViewById(R.id.additional_details);
buttonAddItem = (Button) rootView.findViewById(R.id.btn_add_item);
//setting the Main Activity Title Programmatically to apply only on this Activity,
// ie making it different from the App name & other activities
// getSupportActionBar().setTitle("Tholumzi Guest House Booking");
//Declaring the awesomeValidation type "BASIC"
awesomeValidation = new AwesomeValidation(ValidationStyle.BASIC);
//validating the views
awesomeValidation.addValidation(nameField, "[a-zA-Z\\s]+", "Enter your name");
awesomeValidation.addValidation(surnameField, "[a-zA-Z\\s]+", "Enter your surname");
awesomeValidation.addValidation(emailField, "^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$", "Enter valid email address");
awesomeValidation.addValidation(yourPhoneField, "[0-9]+", "your phone number eg 078 123...");
awesomeValidation.addValidation(numberOfGuestsField, "[0-9]+", "Number of guests eg 50");
updateUI(); // NB: this method is called up here within the OnCreate
return rootView;
}
//finding View by Id from the relevant xml View for both EditText and CheckBoxes
private void updateUI() {
//processing DatePickerDialog popup to your android app
mDisplayDate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Calendar cal = Calendar.getInstance();
int day = cal.get(Calendar.DAY_OF_MONTH);
int month = cal.get(Calendar.MONTH);
int year = cal.get(Calendar.YEAR);
DatePickerDialog dialog = new DatePickerDialog(
getActivity(),
android.R.style.Theme_Holo_Light_Dialog_MinWidth,
mDateSetListener,
year,month,day);
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
dialog.show();
}
});
mDateSetListener = new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker datePicker, int year, int month, int day) {
month = month + 1;
//choose how it will appear, ie "dd/mm/yyyy"
String date = day + "/" + month + "/" + year;
mDisplayDate.setText(date);
}
};
//this is the submit button called and initialized by its Id from the View
//buttonAddItem = (Button) layoutView.findViewById(R.id.btn_add_item);
buttonAddItem.setOnClickListener(this);
}
//This is the part where data is transferred from Your Android phone to Sheet
// by using HTTP Rest API calls (Volley Library)
//Volley Library - ie our networking Library
private void addItemToSheet() {
// the "true, true" at the end of ProgressDialog method makes it possible to cancel the auto loading of the
// submiting dialogue box eg especially due to lack of connectivity on the device. it cancels back to the MainActivity still
// with all the information still intact, meaning you can re-submit again.
final ProgressDialog loading = ProgressDialog.show(getActivity(), "Submitting information...", "if it's taking too long, check your Network and Internet connectivity",true,true);
final String studentname = nameField.getText().toString().trim(); //converting EditText View to String
final String surname = surnameField.getText().toString().trim(); //converting EditText View to String
final String email = emailField.getText().toString().trim(); //converting EditText View to String
final String yourphonenumber = yourPhoneField.getText().toString().trim(); //converting EditText View to String
final String date = mDisplayDate.getText().toString().trim(); //converting EditText View to String
final String eventsduration = eventsDurationField.getText().toString().trim(); //converting EditText View to String
final String numberofguests = numberOfGuestsField.getText().toString().trim(); //converting EditText View to String
final String address = addressField.getText().toString().trim(); //converting EditText View to String
final String specify = specifyField.getText().toString().trim();// converting EditText View to String
final String additionaldetails = additionalDetailsField.getText().toString().trim(); //converting EditText View to String
//processing Checkboxes
boolean mr = mrField.isChecked(); // check if Mr Checkbox field is checked.
final String mr_checkbox = String.valueOf(mr); //converting checkbox to String
boolean mrs = mrsField.isChecked(); //check if Mrs checkbox field is checked
final String mrs_checkbox = String.valueOf(mrs);// converting checkbox to String
boolean miss = missField.isChecked(); //check if Miss checkbox field is checked
final String miss_checkbox = String.valueOf(miss); // converting checkbox to String
boolean mFriend = friendField.isChecked(); //check if firsttimevisitoryesfield checkbox field is checked
final String friend_checkbox = String.valueOf(mFriend); // converting checkbox to String
boolean mYoutube = youtubeField.isChecked(); //check if youtube checkbox field is checked
final String youtube_checkbox = String.valueOf(mYoutube); // converting checkbox to String
boolean mWebsite = websiteField.isChecked(); //check if website checkbox field is checked
final String website_checkbox = String.valueOf(mWebsite);// converting checkbox to String
boolean mVimeo = vimeoField.isChecked(); //check if vimeo checkbox field is checked
final String vimeo_checkbox = String.valueOf(mVimeo);// converting checkbox to String
boolean mInternet = internetField.isChecked(); //check if internet checkbox field is checked
final String internet_checkbox = String.valueOf(mInternet); // converting checkbox to String
boolean mGoogle = googleField.isChecked(); //check if google checkbox field is checked
final String google_checkbox = String.valueOf(mGoogle); // converting checkbox to String
boolean mOther = otherField.isChecked();
final String other_checkbox = String.valueOf(mOther);
boolean mlodgeGuestHouse = lodgeGuestHouseField.isChecked(); //if Lodge/Guest House checkbox field is checked
final String lodgegusethouse_checkbox = String.valueOf(mlodgeGuestHouse); // converting checkbox to String
boolean mGardenWedding = gardenWeddingField.isChecked(); //if garden wedding checkbox field is checked
final String gardenwedding_checkbox = String.valueOf(mGardenWedding); // converting checkbox to String
boolean mCorporateEvent = corporateEventField.isChecked(); //if Corporate Event checkbox field is checked
final String corporateevent_checkbox = String.valueOf(mCorporateEvent);// converting checkbox to String
boolean mParty = partyField.isChecked(); //if party checkbox field is checked
final String party_checkbox = String.valueOf(mParty); // converting checkbox to String
boolean mPhotoShoot = photoShootField.isChecked(); //if photo shoot checkbox field is checked
final String photoshoot_checkbox = String.valueOf(mPhotoShoot); // converting checkbox to String
boolean mOtherServiceField = otherServiceField.isChecked(); //if Other Service checkbox field is checked
final String otherservice_checkbox = String.valueOf(mOtherServiceField); // converting checkbox to String
// we pass the google sheet url address from your Google Drive Apps script
StringRequest stringRequest = new StringRequest(Request.Method.POST, "//google app script url" ,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
loading.dismiss();
//fetches the "success" message from the google app script after the success data submission to excel
Toast.makeText(getActivity(), response, Toast.LENGTH_LONG).show();
//opens thank you activity after successful submission
Intent intent = new Intent(getActivity(), Thankyou.class);
startActivity(intent);
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}
)
// HashMap library starts here. We use it for Key - value mapping
{
@Override
protected Map<String, String> getParams() {
Map<String, String> parmas = new HashMap<>();
//here we pass params
// "K: key" eg YourPhoneNumber is the one you are going to use as reference on your App Script in google drive
//and Postman. and this Key is not found anywhere else in the code except here
//"v: value" eg yourphonenumber is the variable we declared ontop on addItemToSheet() method for this field
parmas.put("action", "addItem");
parmas.put("Name", studentname);
parmas.put("Surname", surname);
parmas.put("Email",email);
parmas.put("YourPhoneNumber", yourphonenumber);
parmas.put("YourChosenDate",date);
parmas.put("EventsDuration",eventsduration);
parmas.put("NumberOfGuests",numberofguests);
parmas.put("Address", address);
parmas.put("Mr",mr_checkbox);
parmas.put("Mrs", mrs_checkbox);
parmas.put("Miss", miss_checkbox);
parmas.put("Friend", friend_checkbox);
parmas.put("Youtube", youtube_checkbox);
parmas.put("Website",website_checkbox);
parmas.put("Vimeo",vimeo_checkbox);
parmas.put("Internet",internet_checkbox);
parmas.put("Google",google_checkbox);
parmas.put("Other",other_checkbox);
parmas.put("Specify",specify);
parmas.put("Lodge_Guest_House", lodgegusethouse_checkbox);
parmas.put("Garden_Wedding", gardenwedding_checkbox);
parmas.put("Corporate_Event", corporateevent_checkbox);
parmas.put("Party", party_checkbox);
parmas.put("Photo_Shoot", photoshoot_checkbox);
parmas.put("Other_Service", otherservice_checkbox);
parmas.put("AdditionalDetails", additionaldetails);
return parmas;
}
};
int socketTimeOut = 50000;// u can change this .. here it is 50 seconds
RetryPolicy retryPolicy = new DefaultRetryPolicy(socketTimeOut, 0, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
stringRequest.setRetryPolicy(retryPolicy);
RequestQueue queue = Volley.newRequestQueue(getActivity());
queue.add(stringRequest);
}
//this is the Onclick listerner which submits data ONLY if all the fields have been validated
//and found to be not empty and have the correct data format
@Override
public void onClick(View v) {
// use the below commented method to submit to Google Spread Sheet "WITHOUT" Validation.
// it simply says, when the submit button is clicked, Submit data.
/* if (v == buttonAddItem) {
addItemToSheet();
//Define what to do when button is clicked
}*/
//此if语句检查所有字段是否均已通过验证,然后添加到Google工作表中如果(awesomeValidation.validate()){
addItemToSheet(); // Adds data to google excel sheet
//shows briefly as soon as you press Submit button after successful validation
Toast.makeText(getActivity(), "Submitting Data", Toast.LENGTH_SHORT).show();
}else{//else if the validation doesnt pass, you get this "Error!" Toast message.
Toast.makeText(getActivity(), "Please enter your Contact Details First!", Toast.LENGTH_LONG).show();
}
}
}
片段需要包含一个活动。由于您尚未发布代码,因此我不知道您是否已将代码添加到要在活动中添加/替换片段的位置。我已经共享了有关片段如何工作的参考文档。
这里是Documentation开头几行的要点
片段代表行为或用户界面中的一部分FragmentActivity。您可以将多个片段合并为一个活动以构建多窗格UI并重用多个片段活动。您可以将片段视为具有自己生命周期的活动接收自己的输入事件,以及您可以在活动运行时添加或删除的内容(包括就像您可以在其他活动中重复使用的“子活动”。
片段必须始终托管在活动中,并且片段的生命周期直接受宿主活动的生命周期影响。对于例如,当活动暂停时,其中的所有片段也都暂停了,并且当活动被销毁时,所有碎片也会被销毁。但是,虽然活动正在运行(处于恢复的生命周期状态),您可以独立操作每个片段,例如添加或删除它们。执行此类片段交易时,您也可以将其添加到由活动管理的后向堆栈-活动是发生的碎片交易的记录。的后退堆栈允许用户撤消片段交易(导航向后),方法是按“后退”按钮。
当您将片段添加为活动布局的一部分时,它位于活动的视图层次结构和片段中的ViewGroup定义自己的视图布局。您可以将片段插入通过在活动布局中声明片段来声明活动布局文件,作为元素,或者通过添加您的应用程序代码到现有的ViewGroup。
希望这有所帮助!