按钮单击时不会调用onClick方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了按钮单击时不会调用onClick方法相关的知识,希望对你有一定的参考价值。

我无法弄清楚当我点击按钮时为什么没有调用onClick方法。但是,相同的代码片段在其他活动中工作正常。任何想法,我错过了什么?

这是Java文件

    public class PicMem extends BaseActivity {

    private String TAG = PicMem.class.getSimpleName();
    private static final String endpoint = "https://api.androidhive.info/json/glide.json";
    private ArrayList<Image> images;
    private ProgressBar progressBar;
    private GalleryAdapter mAdapter;
    private EmptyRecyclerView recyclerView;
    private View emptyView;
    private Button btnRetry;
    private SwipeRefreshLayout mSwipeRefreshLayout;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(com.dailyzaib.siddhashram.R.layout.activity_pic_mem);

        setupToolbar();
        checkInternetConnection();

        recyclerView = (EmptyRecyclerView) findViewById(com.dailyzaib.siddhashram.R.id.recycler_view);

        progressBar = (ProgressBar) findViewById(R.id.progressBar);

        images = new ArrayList<>();
        mAdapter = new GalleryAdapter(getApplicationContext(), images);

        RecyclerView.LayoutManager mLayoutManager = new GridLayoutManager(getApplicationContext(), 2);
        recyclerView.setLayoutManager(mLayoutManager);

        emptyView = findViewById(R.id.recycler_view_empty);
        recyclerView.setEmptyView(emptyView);

        recyclerView.setItemAnimator(new DefaultItemAnimator());
        recyclerView.setAdapter(mAdapter);

        recyclerView.addOnItemTouchListener(new GalleryAdapter.RecyclerTouchListener(getApplicationContext(), recyclerView, new GalleryAdapter.ClickListener() {
            @Override
            public void onClick(View view, int position) {
                Bundle bundle = new Bundle();
                bundle.putSerializable("images", images);
                bundle.putInt("position", position);

                FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
                SlideshowDialogFragment newFragment = SlideshowDialogFragment.newInstance();
                newFragment.setArguments(bundle);
                newFragment.show(transaction, "slideshow");
            }

            @Override
            public void onLongClick(View view, int position) {

            }
        }));

        btnRetry = (Button) findViewById(R.id.btnRetry);
        btnRetry.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.e(TAG, "Calling onClick");
                checkInternetConnection();
            }
        });

        mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipeContainer);
        mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        checkInternetConnection();
                        mSwipeRefreshLayout.setRefreshing(false);
                    }
                }, 500);
            }
        });
    }

    private void setupToolbar() {

        final ActionBar ab = getActionBarToolbar();
        ab.setHomeAsUpIndicator(com.dailyzaib.siddhashram.R.drawable.ic_menu);
        ab.setDisplayHomeAsUpEnabled(true);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.refresh_images, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                openDrawer();
                return true;

            case R.id.refresh_pid:
                checkInternetConnection();
                break;

            case R.id.menu_prefs:
                startActivity(new Intent(this, SettingsPrefActivity.class));
                break;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    protected int getSelfNavDrawerItem() {
        return com.dailyzaib.siddhashram.R.id.nav_memories;
    }

    @Override
    public boolean providesActivityToolbar() {
        return true;
    }

    private void fetchImages() {
        if (progressBar != null) {
            progressBar.setVisibility(View.VISIBLE);
        }

        JsonArrayRequest req = new JsonArrayRequest(endpoint,
                new Response.Listener<JSONArray>() {
                    @Override
                    public void onResponse(JSONArray response) {
                        Log.d(TAG, response.toString());
                        if (progressBar != null) {
                            progressBar.setVisibility(View.GONE);
                        }

                        images.clear();
                        for (int i = 0; i < response.length(); i++) {
                            try {
                                JSONObject object = response.getJSONObject(i);
                                Image image = new Image();
                                image.setName(object.getString("name"));

                                JSONObject url = object.getJSONObject("url");
                                image.setSmall(url.getString("small"));
                                image.setMedium(url.getString("medium"));
                                image.setLarge(url.getString("large"));
                                image.setTimestamp(object.getString("timestamp"));

                                images.add(image);

                            } catch (JSONException e) {
                                Log.e(TAG, "Json parsing error: " + e.getMessage());
                            }
                        }

                        mAdapter.notifyDataSetChanged();

                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e(TAG, "Error: " + error.getMessage());
                if (progressBar != null) {
                    progressBar.setVisibility(View.GONE);
                }
            }
        });

        // Adding request to request queue
        AppController.getInstance().addToRequestQueue(req);
    }

    //////// Check Internet Connection ////////////////////

    private void checkInternetConnection(){

        new InternetCheckAsyncTask(this, new InternetCheckAsyncTask.InternetConsumer() {

            @Override
            public void internetStatusResult(Boolean internet) {
                showSnack(internet);
            }
        });
    }

    private void showSnack(boolean isConnected) {

        if (!isConnected) {

            emptyView.setVisibility(View.VISIBLE);

            Snackbar snackbar = Snackbar.make(findViewById(R.id.drawer_layout), "No Active Internet Connection", Snackbar.LENGTH_LONG)
                    .setAction("RETRY", new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            checkInternetConnection();
                        }
                    });

            View snackbarLayout = snackbar.getView();

            // SnackBar Message Text color
            TextView textView = (TextView) snackbarLayout.findViewById(android.support.design.R.id.snackbar_text);
            textView.setTextColor(Color.YELLOW);

            // Changing Action Button Text Color
            snackbar.setActionTextColor(Color.WHITE);

            snackbar.show();
        }else{

            emptyView.setVisibility(View.INVISIBLE);
            fetchImages();
        }
    }

    //////// End Of Check Internet Connection ////////////////////

    @Override
    protected void onResume() {
        super.onResume();
        checkInternetConnection();
    }
}

这是上面活动的XML布局

    <?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/theme_primary_dark"
        android:orientation="vertical">

        <include layout="@layout/include_toolbar" />

        <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior">

            <include layout="@layout/include_nointernet" />

            <include layout="@layout/include_progress_layout" />

            <android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:id="@+id/swipeContainer"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

                <com.dailyzaib.siddhashram.extra.EmptyRecyclerView
                    android:id="@+id/recycler_view"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:scrollbars="vertical" />

            </android.support.v4.widget.SwipeRefreshLayout>
        </RelativeLayout>

    </LinearLayout>

    <include layout="@layout/include_navigation" />
</android.support.v4.widget.DrawerLayout>

最后,没有被调用的按钮(btnRetry)的布局:

    <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/recycler_view_empty"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:visibility="visible">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        app:srcCompat="@drawable/ic_depress" />

    <TextView
        android:id="@+id/tvNoConnection"
        style="@style/TextAppearance.AppCompat.Title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/imageView"
        android:layout_centerHorizontal="true"
        android:layout_margin="10dp"
        android:text="@string/no_internet_connection"
        android:textColor="@color/cardview_light_background" />

    <TextView
        android:id="@+id/tvNoConnectionDesc"
        style="@style/TextAppearance.AppCompat.Small"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/tvNoConnection"
        android:layout_centerHorizontal="true"
        android:layout_margin="10dp"
        android:text="@string/no_internet_description"
        android:textColor="@color/cardview_light_background" />

    <Button
        android:id="@+id/btnRetry"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/tvNoConnectionDesc"
        android:layout_centerHorizontal="true"
        android:layout_margin="10dp"
        android:background="@drawable/button_background"
        android:paddingLeft="30dp"
        android:paddingRight="30dp"
        android:text="@string/no_internet_try_again"
        android:textColor="@color/cardview_light_background" />

</RelativeLayout>
答案

尝试改变位置

<include layout="@layout/include_nointernet" />

在SwipeRefreshLayout内部,如下所示

    <android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:id="@+id/swipeContainer"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

                <include layout="@layout/include_nointernet" />

                <com.dailyzaib.siddhashram.extra.EmptyRecyclerView
                    android:id="@+id/recycler_view"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:scrollbars="vertical" />

            </android.support.v4.widget.SwipeRefreshLayout>
另一答案

更改您的layout_visibility="visible"或删除此属性。跟着它 -

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/recycler_view_empty"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="visible">
</RelativeLayout>

让我知道发生什么事。

以上是关于按钮单击时不会调用onClick方法的主要内容,如果未能解决你的问题,请参考以下文章

调用onclick时Android从Fragment更改Tab

在通知单击时启动片段而不会丢失状态

从 Activity 到特定选项卡/片段的按钮 OnClick

按钮需要单击两次才能工作 - 为啥?

button按钮如何在onclick中调用java后台函数

在按钮单击时使用参数调用 mvc 操作 [重复]