can not use findViewById method in public void function

im using fragment in android i have a fragment with CustomersFragment name in this fragment im using findViewById method wehen i using this method on onCreateView no problem , but when i using in public void function it has error , this is the my fragment code at the bottom

package com.androiddeft.navigationdrawer.fragments;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

import com.androiddeft.navigationdrawer.MyListAdapter;
import com.androiddeft.navigationdrawer.R;
import com.androiddeft.navigationdrawer.Employee;
import com.androiddeft.navigationdrawer.DatabaseHelper;
import com.androiddeft.navigationdrawer.constants.NavigationDrawerConstants;

import java.util.List;


public class CustomersFragment extends Fragment {

    private Button btnSubmit;
    private Button btnCancel;
    private ListView listView;
    private MyListAdapter adapter;
    private EditText edtSearch, edtName, edtPhone, edtAddress;
    private int seletcedEmployeeId;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getActivity().setTitle(NavigationDrawerConstants.TAG_CUSTOMERS);
    }

    @Override
    public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) {
        // Create the view from XML layout.
        final View view = inflater.inflate(R.layout.fragment_customers, null);
        // Perform additional configuration on layout components here.
        Button btnAdd = (Button) view.findViewById(R.id.btn_add);
        Button btnShowSearch = (Button) view.findViewById(R.id.btn_search);
        Button btnCloseSearch = (Button) view.findViewById(R.id.btn_close_search);
        Button btnDoSearch = (Button) view.findViewById(R.id.btn_do_search);
        btnCancel = (Button) view.findViewById(R.id.btn_cancel);
        btnSubmit = (Button) view.findViewById(R.id.btn_submit);

        edtSearch = (EditText) view.findViewById(R.id.edt_search);
        edtName = (EditText) view.findViewById(R.id.edt_employee_name);
        edtPhone = (EditText) view.findViewById(R.id.edt_employee_phone);
        edtAddress = (EditText) view.findViewById(R.id.edt_employee_address);

        btnAdd.setOnClickListener(onAddClicked);
        btnShowSearch.setOnClickListener(onShowSearchClicked);
        btnCloseSearch.setOnClickListener(onCloseSearchClicked);
        btnDoSearch.setOnClickListener(onDoSearchClicked);
        btnCancel.setOnClickListener(onCancelbuttonClicked);

        listView = (ListView) view.findViewById(R.id.listView);
        refreshList();
        return view;
    }
    private void refreshList() {
        List<Employee> employees = new DatabaseHelper(this).getListOfEmployees();
        adapter = new MyListAdapter(this, employees);
        listView.setAdapter(adapter);
    }

    public void editEmployee(Employee employee) {
        findViewById(R.id.lin_add_search).setVisibility(View.GONE);
        findViewById(R.id.add_edit_employee).setVisibility(View.VISIBLE);
        btnSubmit.setOnClickListener(onEditEmployeeSubmit);
        edtName.setText(employee.getName());
        edtPhone.setText(employee.getPhone());
        edtAddress.setText(employee.getAddress());
        seletcedEmployeeId = employee.getId();
    }

    private View.OnClickListener onAddClicked = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            findViewById(R.id.lin_add_search).setVisibility(View.GONE);
            findViewById(R.id.add_edit_employee).setVisibility(View.VISIBLE);
            btnSubmit.setOnClickListener(onNewEmployeeSubmit);
        }
    };

    private View.OnClickListener onShowSearchClicked = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            findViewById(R.id.lin_add_search).setVisibility(View.GONE);
            findViewById(R.id.search_bar).setVisibility(View.VISIBLE);
        }
    };

    private View.OnClickListener onCloseSearchClicked = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            findViewById(R.id.lin_add_search).setVisibility(View.VISIBLE);
            findViewById(R.id.search_bar).setVisibility(View.GONE);
            edtSearch.setText("");
            refreshList();
        }
    };

    private View.OnClickListener onDoSearchClicked = new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            String input = edtSearch.getText().toString();
            if (input.length() == 0) {
                Toast.makeText(getActivity(), "لطفا قسمتی از نام کارمند را بنویسید", Toast.LENGTH_SHORT).show();
                return;
            }

            List<Employee> employees = new DatabaseHelper(getActivity()).searchByName(input);
            adapter = new MyListAdapter(getActivity(), employees);
            listView.setAdapter(adapter);
            Toast.makeText(getActivity(), employees.size() + " کارمند پیدا شد", Toast.LENGTH_SHORT).show();
        }
    };

    private View.OnClickListener onCancelbuttonClicked = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            edtName.setText("");
            edtPhone.setText("");
            edtAddress.setText("");
            findViewById(R.id.lin_add_search).setVisibility(View.VISIBLE);
            findViewById(R.id.add_edit_employee).setVisibility(View.GONE);
        }
    };

    private View.OnClickListener onNewEmployeeSubmit = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (edtName.getText().length() == 0 || edtPhone.getText().length() == 0 || edtAddress.getText().length() == 0) {
                Toast.makeText(getActivity(), "لطفا اطلاعات را وارد کنید", Toast.LENGTH_SHORT).show();
                return;
            }
            Employee employee = new Employee();
            employee.setName(edtName.getText().toString());
            employee.setPhone(edtPhone.getText().toString());
            employee.setAddress(edtAddress.getText().toString());
            new DatabaseHelper(getActivity()).addNewEmployee(employee);
            refreshList();
            btnCancel.performClick();
        }
    };

    private View.OnClickListener onEditEmployeeSubmit = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (edtName.getText().length() == 0 || edtPhone.getText().length() == 0 || edtAddress.getText().length() == 0) {
                Toast.makeText(getActivity(), "لطفا اطلاعات را وارد کنید", Toast.LENGTH_SHORT).show();
                return;
            }
            Employee employee = new Employee();
            employee.setId(seletcedEmployeeId);
            employee.setName(edtName.getText().toString());
            employee.setPhone(edtPhone.getText().toString());
            employee.setAddress(edtAddress.getText().toString());
            new DatabaseHelper(getActivity()).editEmployee(employee);
            refreshList();
            btnCancel.performClick();
        }
    };
}

Upvotes: 0

Views: 852

Answers (1)

Ben P.
Ben P.

Reputation: 54264

Android developers commonly work with two methods named findViewById(). One of them is part of the Activity class and is usually invoked like this:

public void myMethod() {
    View myView = findViewById(R.id.myView);
}

The other is part of the View class, and is usually invoked like this:

public void myMethod(View root) {
    View myView = root.findViewById(R.id.myView);
}

However, there's no findViewById() method in the Fragment class, so you must use the View method instead. You're already doing that in your onCreateView():

@Override
public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) {
    final View view = inflater.inflate(R.layout.fragment_customers, null);
    Button btnAdd = (Button) view.findViewById(R.id.btn_add);
                             ^^^^^^^^^^^^^^^^^

However, later on you have this:

public void editEmployee(Employee employee) {
    findViewById(R.id.lin_add_search).setVisibility(View.GONE);
    ^^^^^^^^^^^^

Again, the Fragment class has no findViewById() method, so this won't compile. Usually the workaround is to call getView().findViewById(). The getView() method returns the same View instance you returned from onCreateView(), so it will work just fine.

Something like this:

public void editEmployee(Employee employee) {
    getView().findViewById(R.id.lin_add_search).setVisibility(View.GONE);

Upvotes: 4

Related Questions