0

我正在开展一项活动,该活动使用两个片段,一个用于在画布上显示图像,第二个具有按钮以影响画布上的元素。我刚刚为这两个按钮设置了 onClickListeners,现在程序在之前没有崩溃的地方崩溃了。这会在它运行时立即发生,所以我不知道到底是什么问题,除了 logcat 说这完全是这个片段的问题。我只能假设我错误地实现了 setOnClickListener。谁能帮我看看我做错了什么?

工具栏片段

package com.example.chris.drawingtest;

import android.app.Activity;
import android.app.Fragment;
import android.content.DialogInterface;
import android.nfc.Tag;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageButton;

import com.example.chris.drawingtest.R;

/**
 * Created by Chris on 11/28/2014.
 */
public class ToolbarFragment extends Fragment {

    ToolSelectionListener mCallback;

    ImageButton pencilButton, eraserButton;

    public interface ToolSelectionListener {
        public void sendNewValue(int newValue);
    }

    public void clicked(ImageButton imageButton) {
        Log.d("we're listening...", "to the buttons!");
        if (imageButton.getId() == eraserButton.getId())
            mCallback.sendNewValue(1);
        else
            mCallback.sendNewValue(0);
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        pencilButton = (ImageButton) getActivity().findViewById(R.id.pencil);
        eraserButton = (ImageButton) getActivity().findViewById(R.id.eraser);

        pencilButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                clicked(pencilButton);
            }
        });

        eraserButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                clicked(eraserButton);
            }
        });

        Log.d("Toolbar Inflation", "Inflating ToolbarFragment...");
        return inflater.inflate(R.layout.fragment_toolbar, container, false);

    }
}

**编辑:** 这里也是匹配的 XML 文件。

片段工具栏:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="40dp"
    android:layout_gravity="bottom|left"
    android:orientation="horizontal"
    >

    <ImageButton
        android:id="@+id/pencil"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_gravity="left"
        android:background="@drawable/pencil"
        />

    <ImageButton
        android:id="@+id/eraser"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_gravity="center"
        android:background="@drawable/eraser"
        />

</LinearLayout>

谢谢你提供的所有帮助!

4

3 回答 3

3

您的部分代码的问题是,在 Fragment 中,您必须夸大视图。只有当你返回它时,你才会给它充气。尝试以onCreateView这种方式更改您的:

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        final View view = inflater.inflate(R.layout.fragment_toolbar, container, false);
        pencilButton = (ImageButton) view.findViewById(R.id.pencil);
        eraserButton = (ImageButton) view.findViewById(R.id.eraser);

        pencilButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                clicked(pencilButton);
            }
        });

        eraserButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                clicked(eraserButton);
            }
        });

        Log.d("Toolbar Inflation", "Inflating ToolbarFragment...");
        return view;

    }
于 2014-12-01T20:52:30.513 回答
1

你得到一个例外,因为你试图ImageButtons在它们膨胀之前调用功能。看看你的 setOnCallListener 之后你的充气机是如何充气的?

在您的onCreateView中,您引用了按钮,pencilButton并且eraserButton不正确地findViewById()取消了 getActivity。

相反,将该逻辑移植到参数上onViewCreated并调用您findViewById(R.id.xxx)View参数。

于 2014-12-01T20:51:30.323 回答
1
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_toolbar, container, false);

    pencilButton = (ImageButton) view.findViewById(R.id.pencil);
    eraserButton = (ImageButton) view.findViewById(R.id.eraser);

    pencilButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            clicked(pencilButton);
        }
    });

    eraserButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            clicked(eraserButton);
        }
    });

    Log.d("Toolbar Inflation", "Inflating ToolbarFragment...");
    return view;

}
于 2014-12-01T20:54:58.997 回答