Android Edit text onclicklistener doesn't work the first time when clicked

Viewed 6095

I wrote function using onClick method to EditText, load data to RecycleView. When click EditText load all data to AlertBox and if click one. Then load all data to RecycleView according to it. First time it doesn't show, but again I click EditText and select data from AlertBox then show details in RecycleView

activity_day_plan.xml

<EditText
        android:id="@+id/txtline"
        android:layout_width="156dp"
        android:layout_height="33dp"
        android:clickable="true"
        android:focusable="false"
        android:focusableInTouchMode="false"

        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="12dp"
        android:background="@drawable/input"
        android:ems="10"
        android:inputType="textPersonName"
        android:textAlignment="center"
        app:layout_constraintEnd_toStartOf="@+id/btnview"
        app:layout_constraintStart_toEndOf="@+id/txtfactoryname"
        app:layout_constraintTop_toBottomOf="@+id/txtfac" />

Main Activity

private EditText addline;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_day_plan);

    addline=(EditText)findViewById(R.id.txtline);

    addline.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            getlist();
        }
    });
}

public void getlist()
{
    arrayList.clear();
    if(addfac.getText().equals(""))
    {
        Toast.makeText(DayPlanActivity.this,"Please Select Factory Code",Toast.LENGTH_SHORT).show();
    }
    else if(addline.getText().equals(""))
    {
        Toast.makeText(DayPlanActivity.this,"Please Select Line Code",Toast.LENGTH_SHORT).show();
    }
    else {
        loadingbar.setMessage("Loading All Line Details");
        StringRequest stringRequest = new StringRequest(Request.Method.POST, Constants.GETDALYDETAILS_URL,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        try {
                            JSONArray jsonArray = new JSONArray(response);
                            for (int i = 0; i < jsonArray.length(); i++) {
                                JSONObject jsonObject = jsonArray.getJSONObject(i);
                                String hourcode1 = jsonObject.getString("hour_code");
                                String prodqty = jsonObject.getString("qrytime");
                                String datetime = jsonObject.getString("hourqty");
                                gethourdetails gethour = new gethourdetails(hourcode1, prodqty, datetime);
                                arrayList.add(gethour);
                            }
                            adapter = new ContactAdapter(arrayList);
                            recyclerView.setAdapter(adapter);
                            loadingbar.dismiss();
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Hours.setText("Something Went Wrong Please Try again later....");
                error.printStackTrace();
            }
        }) {
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String, String> params = new HashMap<String, String>();
                params.put("username", username);
                params.put("qno", qno);
                return params;
            }
        };
        stringRequest.setRetryPolicy(new DefaultRetryPolicy(
                60000,
                DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
        MySingleton.getInstance(getApplicationContext()).addToRequestque(stringRequest);
    }
}
4 Answers

Use onTouchListener instead of onClickListener

addline.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if(event.getAction() == MotionEvent.ACTION_UP) {
            getlist();
            return true;
        }
        return false;
    }
});

All you need to do is disable focus on that view and your view will react the first click.

In XML

<androidx.appcompat.widget.AppCompatEditText
        android:id="@+id/edit_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:focusable="false" <!--this line does the magic -->
        android:gravity="top" />

In Java

    EditText editText = findViewById(R.id.username);
    editText.setFocusable(false);

In Kotlin

    val editText = findViewById<EditText>(R.id.edit_text)
    editText.isFocusable = false

Use onFocusChangeListener instead of onClickListener:

yourEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
       @Override
       public void onFocusChange(View view, boolean b) {
             if (b)
                // do your stuff here if b is true
       }
});

You are not able to use click event in properly to the Edittext. Because your first click is receiving like a cursor focus listener. So you have to use onTouch listener or you have tried the another hacking

like

<ReleativeLayout
.
.

   <Edittext
   ..
    />

/>

Here you have to write click method to the relative layout. You may achieve your goal

Related