You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为PDF阅读器按钮同时配置OnClickListener与OnLongClickListener

为PDF阅读器的FloatingActionButton添加长按启动第二个Activity的功能

问题背景

我开发了一款PDF阅读器,其中的action_button已绑定OnClickListener,点击时会弹出页码选择弹窗。现需为该按钮添加OnLongClickListener,实现长按自动启动第二个Activity的功能,当前相关代码及布局文件如下:

现有Java代码

public void actionButtonClick(View view) {
        if (pageCount == 0) {
            Toast.makeText(getApplicationContext(), getString(R.string.no_selected_pdf), Toast.LENGTH_LONG).show();
            return;
        }
        final BottomSheetDialog dialog = new BottomSheetDialog(MainActivity.this);
        dialog.setContentView(R.layout.bottom_sheet);
        dialog.setCanceledOnTouchOutside(true);
        NumberPicker numberPicker = (NumberPicker) dialog.findViewById(R.id.number_picker);
        if (numberPicker != null) {
            numberPicker.setMaxValue(pageCount);
            numberPicker.setValue(pdfView.getCurrentPage() + 1);
            numberPicker.setOnValueChangedListener((picker, oldVal, newVal) -> {
                pdfView.jumpTo(newVal - 1, true);
            });
        }
        dialog.show();
    }


    public void openButtonClick(View view) {
        launchPicker();
    }

    private void startAnimation(int state) {
        actionLayout.animate()
                .translationY(state == 0 ? actionLayout.getHeight() : 0)
                .alpha(state == 0 ? 0 : 1.0f)
                .setDuration(300).setListener(new AnimatorListenerAdapter() {
                    @Override
                    public void onAnimationEnd(Animator animation) {
                        menu.findItem(R.id.hide_or_show_button).setChecked(state != 1);
                        super.onAnimationEnd(animation);
                    }
                });
    }

    private void hideOrShowActionButton() {
        if (actionLayout.getAlpha() == 1.0)
            startAnimation(0);
        else
            startAnimation(1);
    }

    private void showSnackBar(@NonNull String msg, boolean isError) {
        Snackbar snackbar = Snackbar
                .make(findViewById(R.id.main_layout), msg, Snackbar.LENGTH_SHORT);
        snackbar.setBackgroundTint(ContextCompat
                .getColor(Objects.requireNonNull(getApplicationContext()),
                        isError ? R.color.err_color : R.color.main_color));
        snackbar.setTextColor(ContextCompat
                .getColor(Objects.requireNonNull(getApplicationContext()), R.color.white));
        snackbar.show();
    }

    @Override
    public void loadComplete(int nbPages) {
        pageCount = nbPages;
        warningLayout.setVisibility(View.GONE);
        PdfDocument.Meta meta = pdfView.getDocumentMeta();
        detailsMap.clear();
        detailsMap.add(meta.getTitle());
        detailsMap.add(meta.getAuthor());
        detailsMap.add(meta.getSubject());
        detailsMap.add(meta.getKeywords());
        detailsMap.add(meta.getCreator());
        detailsMap.add(meta.getProducer());
        detailsMap.add(dateFormatter(meta.getCreationDate()));
        detailsMap.add(dateFormatter(meta.getModDate()));
    }

    private String dateFormatter(String data) {
        if (!data.isEmpty()) {
            String date = data.substring(2);
            String y = date.substring(0, 4);
            String m = date.substring(4, 6);
            String d = date.substring(6, 8);
            return y + "/" + m + "/" + d;
        } else {
            return data;
        }
    }

    @Override
    public void onPageChanged(int page, int pageCount) {
        pageNumber.setText(String.valueOf(page + 1));
    }

    @Override
    public void onPageError(int page, Throwable t) {
        showSnackBar(getString(R.string.page_not_loaded) + page, true);
    }
}

现有布局文件

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/bg_color"
    tools:context=".MainActivity">

    <com.github.barteksc.pdfviewer.PDFView
        android:id="@+id/pdf_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/bg_color"
        app:layout_anchor="@+id/warning"
        app:layout_anchorGravity="center">

        <Button
            android:id="@+id/button"
            android:layout_width="42dp"
            android:layout_height="11dp"
            android:layout_below="@id/textView"
            android:layout_alignParentBottom="true"
            android:layout_marginBottom="518dp"
            android:text="open activity 2" />
    </com.github.barteksc.pdfviewer.PDFView>

    <LinearLayout
        android:id="@+id/warning"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal|center_vertical"
        android:orientation="vertical">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:text="@string/no_selected_pdf"
            android:textColor="@color/secondary_text_color"
            android:textSize="16sp" />

        <TextView
            android:id="@+id/tv_open_pdf"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:clickable="true"
            android:focusable="true"
            android:onClick="openButtonClick"
            android:padding="10dp"
            android:text="@string/click_to_select_pdf"
            android:textColor="@color/main_color"
            android:textSize="18sp" />

    </LinearLayout>


    <FrameLayout
        android:id="@+id/action_layout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end">

        <com.google.android.material.floatingactionbutton.FloatingActionButton
            android:id="@+id/action_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|end"
            android:layout_margin="20dp"
            android:contentDescription="@string/action_btn_description"
            android:onClick="actionButtonClick"
            app:backgroundTint="@color/main_color"
            app:borderWidth="0dp"
            app:tint="@color/white" />

        <TextView
            android:id="@+id/tv_page_number"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:elevation="16dp"
            android:text="x"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:textColor="@android:color/white"
            android:textSize="16sp" />

    </FrameLayout>

</androidx.coordinatorlayout.widget.CoordinatorLayout>

解决方案

1. 绑定长按事件监听器

在MainActivity的onCreate方法中,获取action_button实例并设置OnLongClickListener,在回调中启动第二个Activity:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    // 初始化其他控件
    pdfView = findViewById(R.id.pdf_view);
    actionLayout = findViewById(R.id.action_layout);
    pageNumber = findViewById(R.id.tv_page_number);
    warningLayout = findViewById(R.id.warning);
    
    // 绑定长按事件
    FloatingActionButton actionButton = findViewById(R.id.action_button);
    actionButton.setOnLongClickListener(v -> {
        // 启动第二个Activity,替换为你的目标Activity类名
        Intent intent = new Intent(MainActivity.this, SecondActivity.class);
        
        // 可选:传递PDF相关数据,比如当前页码、PDF路径
        // intent.putExtra("CURRENT_PAGE", pdfView.getCurrentPage() + 1);
        // intent.putExtra("PDF_PATH", yourPdfFilePath);
        
        startActivity(intent);
        return true; // 返回true表示长按事件已处理,不会触发点击事件
    });
    
    // 其他初始化逻辑...
}

2. 注册第二个Activity

确保目标Activity已在AndroidManifest.xml中注册:

<activity
    android:name=".SecondActivity"
    android:exported="false" /> <!-- 若需外部启动则设为true -->

3. 注意事项

  • 返回true:长按回调中返回true可避免长按结束后触发点击事件,防止同时弹出页码弹窗和启动Activity。
  • 数据传递:如需在目标Activity中获取PDF信息,可通过Intent.putExtra()传递,在目标Activity中用getIntent().getXXXExtra()获取。

内容的提问来源于stack exchange,提问作者Galaxy01

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 13:03:22