我有一个Android应用程序,我有一个带有两个片段的横向视图。左侧片段具有列表,右侧片段是显示信息的常规视图。现在我有一个视图,我有两个按钮“添加联系人”和“编辑联系人”。当我单击“添加联系人”按钮时,成功添加另一个用户可以输入联系信息的片段。完成后,用户单击“保存”按钮,这是我收到错误的地方。
在我的SHContactOverviewActivty类中,我有以下代码:
public void addContact(View view) {
SHConfigureContactFragment shConfigContactFrag = new SHConfigureContactFragment();
final FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.contentPanel, shConfigContactFrag);
ft.addToBackStack(null);
ft.commit();
}
与以下称为sh_fragment_contact_info:
的XML相关联<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<Button
android:id="@+id/addContactButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:background="@drawable/sh_button_selector"
android:onClick="addContact"
android:padding="@dimen/padding_medium"
android:text="Add Contact"
android:textColor="@color/text_white"
android:textSize="@dimen/text_size_take_survey_button"
android:textStyle="bold" />
</LinearLayout>
</RelativeLayout>
这成功地在顶部添加了以下片段,我可以在视图之间来回移动。 SHConfigureContactFragment类如下:
public class SHConfigureContactFragment extends Fragment{
private EditText name;
private EditText description;
private EditText primaryNumber;
private EditText secondaryNumber;
private EditText email;
private EditText skype;
private Byte[] photo;
private Boolean isDualPane;
private FragmentManager fragmentManager;
private SHContactMenuFragment menuFragment;
private SHConfigureContactFragment contactFragment;
private DatabaseControllerLibrary controller;
private Contact contact;
private SHPatient patient;
private int patientId;
public View rootView;
public int selectedIndex;
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if(savedInstanceState != null) {
this.selectedIndex = savedInstanceState.getInt("SELECTED_INDEX");
this.contact = (Contact) savedInstanceState.getSerializable("CONTACT");
}
}
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putSerializable("CONTACT", contact);
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
controller = SHController.getInstance(getActivity());
patient = ((SHController) controller).getPatient();
patientId = patient.getId();
}
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
super.onCreateView(inflater, container, savedInstanceState);
rootView = inflater.inflate(R.layout.sh_fragment_contact_edit, container, false);
return rootView;
}
private void setupTextFieldsByContact(Contact contact) {
name = (EditText) rootView.findViewById(R.id.editContactName);
description = (EditText) rootView.findViewById(R.id.editContactDescription);
primaryNumber = (EditText) rootView.findViewById(R.id.editContactPrimaryNumber);
secondaryNumber = (EditText) rootView.findViewById(R.id.editContactSecondaryNumber);
email = (EditText) rootView.findViewById(R.id.editContactEmail);
skype = (EditText) rootView.findViewById(R.id.editContactSkype);
if (contact != null) {
name.setText(contact.getName());
description.setText(contact.getDescription());
primaryNumber.setText(contact.getPrimaryNumber());
secondaryNumber.setText(contact.getSecondaryNumber());
email.setText(contact.getEmail());
skype.setText(contact.getSkype());
}
}
//Listener for saveContact 'onClick' in sh_fragment_contact_edit.xml for the "Save" button
public void saveContact(View view){
boolean isValid = true;
// assigning IDs based on how many contacts are created. no reused IDs son!
int id = controller.getContactsCount();
id++;
String newName = name.getText().toString().trim();
String newDescription = description.getText().toString().trim();
String newPrimaryNumber = primaryNumber.getText().toString().trim();
String newSecondaryNumber = secondaryNumber.getText().toString().trim();
String newEmail = email.getText().toString().trim();
String newSkype = skype.getText().toString().trim();
if(newName.length()==0 || newName.matches(".*\\d.*")) {
name.setText("");
isValid = false;
}
if(newPrimaryNumber.length()==0) {
primaryNumber.setText("");
isValid = false;
}
if (isValid){
Contact updatedContact;
ContactConfiguration updatedConfiguration;
if (contact != null){
id = contact.getId();
}
updatedContact = new Contact(id, newName, newDescription, newPrimaryNumber, newSecondaryNumber, newEmail, newSkype, null);
updatedConfiguration = new ContactConfiguration(patientId, patientId, false, updatedContact);
if (contact == null){
controller.addContact(updatedContact, patientId);
}
else{
controller.updateContact(updatedContact, patientId);
}
}
}
}
我在这里关注的方法是onSave(View v),其中我有代码将联系人添加到我创建的数据库中。
此视图附加到名为sh_fragment_contact_edit的XML,其中包含以下内容:
<Button
android:id="@+id/addContactButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginTop="30dp"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:background="@drawable/sh_button_selector"
android:onClick="saveContact"
android:padding="@dimen/padding_medium"
android:text="Save Contact"
android:textColor="@color/text_white"
android:textSize="@dimen/text_size_take_survey_button"
android:textStyle="bold" />
我知道这有很多东西要看,但我认为只需要解释这个问题。当视图全部正确加载时,但是一旦我单击“保存”按钮,我会收到以下错误:
无法在活动类SHContactOverviewActivty中找到方法saveContact(View),用于视图类android.widget.Button上的onClick处理程序,其id为“addContactButton”
我的问题是,我是否需要在SHContactOverviewActivty中使用此saveContact(View视图)方法,即使我在SHConfigureContactFragment中只有saveContact()(我打算保存联系信息的片段)?
我不明白为什么我会在SHContactOverviewActivty中需要它,因为那不是我调用它的片段。
再一次,对于长度感到抱歉,但是我一直坚持这么久,看着这么多不同的帖子,我认为我需要解释更多。
答案 0 :(得分:2)
我认为它在活动中寻找saveContact()
,而不是片段。我想你必须通过查看按钮的ID在你的片段的onCreateView中使用Button.setOnClickListener(new OnClickListener(){onClick()...});
。
Button button = (Button) view.findViewById(R.id.addContactButton);
button.setOnClickListener(new OnClickListener(){
@Override
public onClick(View v){
//Code
});
我强烈推荐这种方法用于正常开发,因为如果你有不同的密度,改变布局中的东西是很繁琐的。此外,可以将clicklisteners重新分配给按钮,或将它们变为null,而不会麻烦。
编辑,针对您的实际问题:布局自动限制为仅将android:onClick
与父活动进行互动,如here所述。这是一个Android限制,可能是因为向后检查是昂贵的。此外,如果片段内的片段内有碎片怎么办?看起来像是一个混乱的代码。您可以拥有许多片段范围来登记。