在片段中单击按钮时,SetOnClickListener不起作用

时间:2019-06-09 15:36:26

标签: java android android-fragments android-activity

我在活动内部的片段中有一个按钮。该片段包含Edittext,供用户输入输入,然后按一个按钮,并执行某些操作。当我单击按钮时,我的logcat选项卡上什至看不到Log.v输出。这意味着android没有检测到onClickListener事件。我想知道是否是因为该事件需要在活动线程中发生并且该片段在另一个线程中起作用。如果有人可以弄清楚如何使它正常工作?

活动

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);
    }
}

片段

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();

    }


}

3 个答案:

答案 0 :(得分:0)

在buttonLaunch.setOnClickListener()方法参数中,您使用了“ new View.onClickListener(){}”,您必须将其更改为“ new OnClickListener(){}”,其他所有内容都将相同。

查看此帖子以获取更多信息:

Android Fragment onClick button Method

答案 1 :(得分:0)

应该可以。检查适配器,以确保其正常工作。另外,最好向我们显示您的日志。

答案 2 :(得分:0)

尝试使用

 buttonLunch = (ImageButton) getActivity().findViewById(R.id.buttonLaunch);