为PDF阅读器按钮同时配置OnClickListener与OnLongClickListener
问题背景
我开发了一款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
相关产品推荐
相关产品推荐

