2014-12-01 3 views
0

Я работаю над активностью, которая использует два фрагмента, один для отображения изображений на холсте, а второй - кнопки, которые влияют на элементы на холсте. Я только что настроил onClickListeners для двух кнопок, и теперь программа рушится там, где раньше она не вылетала. Это происходит сразу же после его запуска, поэтому я не знаю, в чем проблема, за исключением того, что logcat говорит, что это полностью проблема с этим фрагментом. Я могу только предположить, что я неправильно реализую setOnClickListener. Может ли кто-нибудь помочь мне увидеть, что я делаю неправильно?Android - setOnClickListener сбой во фрагменте

ToolbarFragment

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

    } 
} 

** EDIT: ** Вот файл XML, а также соответствие.

fragment_toolbar:

<?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> 

Спасибо за любую помощь вы можете дать!

+0

, где '' R.id.pencil' и R.id.eraser' объявили? – Blackbelt

+0

они находятся в файле XML, который я добавил в основной вопрос. – user2828965

ответ

1

Вы получаете исключение, потому что пытаетесь вызвать функциональность на ImageButtons, прежде чем они завышены. Посмотрите, как ваш накачка накачивается после вашего setOnCallListener?

В ваших onCreateView, вы ссылающихся кнопки, pencilButton и eraserButton неправильно, позвонив findViewById() прочь getActivity.

Вместо этого пересадите эту логику на onViewCreated и позвоните по номеру findViewById(R.id.xxx) по параметру View.

+0

И точно так же, getActivity(). FindViewById (R.id.xxx), как правило, очень плохая практика. –

+0

Я не знал. Что было бы лучшим методом? – user2828965

+0

См. Решение выше. –

3

Проблема вашей части кода заключается в том, что во Фрагменте вам нужно раздуть представление. Вы раздуваете его только тогда, когда вы его возвращаете. Попробуйте изменить свой 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; 

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

} 
Смежные вопросы