在活动类中找不到方法

时间:2014-12-08 23:53:08

标签: android android-activity android-fragments

我有一个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中需要它,因为那不是我调用它的片段。

再一次,对于长度感到抱歉,但是我一直坚持这么久,看着这么多不同的帖子,我认为我需要解释更多。

1 个答案:

答案 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限制,可能是因为向后检查是昂贵的。此外,如果片段内的片段内有碎片怎么办?看起来像是一个混乱的代码。您可以拥有许多片段范围来登记。