0

I have a button inside a fragment that is inside an activity. The fragment contains Edittext for user to enter input then press a button and some action is processed. When I click the button I don't even see Log.v output on my logcat tab. That means android is not detecting the onClickListener event. I wonder if is because that event needs to happen in the activity thread and the fragment works in another thread. If someone could clarify how to get this working?

Activity

public class TracerouteActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_traceroute);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
    }
}

Fragment

package org.pctechtips.netdroid.traceroute;

import android.app.ProgressDialog;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;

import static android.content.ContentValues.TAG;

public class TraceRouteFragment extends Fragment {

    public static final String tag = "TraceroutePing";
    public static final String INTENT_TRACE = "INTENT_TRACE";


    private Button buttonLaunch;
    private EditText editTextPing;
    private ProgressBar progressBarPing;
    private ListView listViewTraceroute;
    private TraceListAdapter traceListAdapter;
    protected ProgressDialog scanProgressDialog;

    private TracerouteWithPing tracerouteWithPing;
    private final int maxTtl = 40;

    private List<TracerouteContainer> traces;

    /**
     * onCreate, init main components from view
     */
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.traceroute, container, false);

        this.tracerouteWithPing = new TracerouteWithPing(this);
        this.traces = new ArrayList<TracerouteContainer>();


        this.buttonLaunch = (Button) view.findViewById(R.id.buttonLaunch);
        this.editTextPing = (EditText) view.findViewById(R.id.editTextPing);
        this.listViewTraceroute = (ListView) view.findViewById(R.id.listViewTraceroute);
        this.progressBarPing = (ProgressBar) view.findViewById(R.id.progressBarPing);

        traceListAdapter = new TraceListAdapter(getContext());
        listViewTraceroute.setAdapter(traceListAdapter);

        buttonLaunch.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (editTextPing.getText().length() == 0) {
                    Toast.makeText(getContext(), getString(R.string.no_text_trace), Toast.LENGTH_SHORT).show();
                } else {
                    traces.clear();
                    traceListAdapter.notifyDataSetChanged();

                    startProgressBar();
                    hideSoftwareKeyboard(editTextPing);
                    tracerouteWithPing.executeTraceroute(editTextPing.getText().toString(), maxTtl);
                }
                Log.v(tag, "traceroute to " + editTextPing.getText().toString());
            }
        });

        return view;
    }

    /**
     * initView, init the main view components (action, adapter...)
     */
    private void initView() {


    }

    /**
     * Allows to refresh the listview of traces
     */
    /*public void refreshList(TracerouteContainer trace) {
        final TracerouteContainer fTrace = trace;
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                traces.add(fTrace);
                traceListAdapter.notifyDataSetChanged();
            }
        });
    }*/


    /**
     * The adapter of the listview (build the views)
     */
    public class TraceListAdapter extends BaseAdapter {

        private Context context;

        public TraceListAdapter(Context c) {
            context = c;
        }

        public int getCount() {
            return traces.size();
        }

        public TracerouteContainer getItem(int position) {
            return traces.get(position);
        }

        public long getItemId(int position) {
            return position;
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder;

            // first init
            if (convertView == null) {
                LayoutInflater vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = vi.inflate(R.layout.item_list_trace, null);

                TextView textViewNumber = (TextView) convertView.findViewById(R.id.textViewNumber);
                TextView textViewIp = (TextView) convertView.findViewById(R.id.textViewIp);
                TextView textViewTime = (TextView) convertView.findViewById(R.id.textViewTime);
                ImageView imageViewStatusPing = (ImageView) convertView.findViewById(R.id.imageViewStatusPing);

                // Set up the ViewHolder.
                holder = new ViewHolder();
                holder.textViewNumber = textViewNumber;
                holder.textViewIp = textViewIp;
                holder.textViewTime = textViewTime;
                holder.imageViewStatusPing = imageViewStatusPing;

                // Store the holder with the view.
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }

            TracerouteContainer currentTrace = getItem(position);

            if (position % 2 == 1) {
                convertView.setBackgroundResource(R.drawable.table_odd_lines);
            } else {
                convertView.setBackgroundResource(R.drawable.table_pair_lines);
            }

            if (currentTrace.isSuccessful()) {
                holder.imageViewStatusPing.setImageResource(R.drawable.ic_check_green_24dp);
            } else {
                holder.imageViewStatusPing.setImageResource(R.drawable.ic_close_red_24dp);
            }

            holder.textViewNumber.setText(position + "");
            holder.textViewIp.setText(currentTrace.getHostname() + " (" + currentTrace.getIp() + ")");
            holder.textViewTime.setText(currentTrace.getMs() + "ms");

            return convertView;
        }

        // ViewHolder pattern
        class ViewHolder {
            TextView textViewNumber;
            TextView textViewIp;
            TextView textViewTime;
            ImageView imageViewStatusPing;
        }
    }

    /**
     * Hides the keyboard
     *
     * @param currentEditText The current selected edittext
     */
    public void hideSoftwareKeyboard(EditText currentEditText) {
        InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
        if (imm.isActive()) {
            imm.hideSoftInputFromWindow(currentEditText.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
        }
    }

    public void startProgressBar() {
        progressBarPing.setVisibility(View.VISIBLE);
        getActivity().getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
                WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
        scanProgressDialog = new ProgressDialog(getContext(), R.style.NewDialog);
        scanProgressDialog.setCancelable(false);
        scanProgressDialog.getWindow().setGravity(Gravity.CENTER);

        scanProgressDialog.setTitle("Tracing.... Please wait");
        scanProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        scanProgressDialog.show();


    }

    public void stopProgressBar() {
//        progressBarPing.setVisibility(View.GONE);
//        getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
        scanProgressDialog.dismiss();


    }


    @Override
    public void onPause() {
        super.onPause();

    }


}
Vedprakash Wagh
  • 3,595
  • 3
  • 12
  • 33
miatech
  • 2,150
  • 8
  • 41
  • 78

3 Answers3

0

In your buttonLaunch.setOnClickListener() method parameter, you have used ' new View.onClickListener(){}', you have to change this to 'new OnClickListener(){}', everything else inside it will be same.

Check out this post for more:

Android Fragment onClick button Method

Vikas
  • 23
  • 1
  • 8
  • I just removed view and android studio ide gives me an error.. "can not resolve symbol onclicklistener" – miatech Jun 09 '19 at 18:51
  • There's another way to do this as well, buttonLaunch.setOnClickListener(view.getContext()) and then implement the View.OnClickListener interface and then inside that method implement you click. – Vikas Jan 31 '21 at 06:40
0

It should work. Check your adapter to be sure it works fine. Also it best you show us your logs.

gsabbih
  • 1
  • 4
0

try using

 buttonLunch = (ImageButton) getActivity().findViewById(R.id.buttonLaunch);
sudesh regmi
  • 536
  • 4
  • 12