Кнопка фрагмента ножа-масляного ножа не работает

У меня есть фрагмент, с которым я использую Butterknife.

public class FooFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.foo, container, false);

        ButterKnife.inject(this, view);

        return view;
    }

    @OnClick(R.id.some_btn)
    public void someButtonOnClick() {
        // do something
    }
}

Однако метод someButtonOnClick никогда не вызывается при нажатии кнопки на экране.

Мысли о том, что я делаю неправильно с фреймворком Butterknife?

Вот макет, который используется:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="@color/White">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:id="@+id/some_btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:layout_margin="@dimen/xsmall_margin"
            android:background="@drawable/some_btn_selection" />

        <Button
            android:id="@+id/some_other_btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:layout_margin="@dimen/xsmall_margin"
            android:background="@drawable/some_other_btn_selection" />
    </LinearLayout>
</LinearLayout>

person Perry Hoekstra    schedule 09.06.2014    source источник
comment
Вероятно, это не связано (поскольку это приведет к ошибке компиляции), но есть ли шанс, что вы пытаетесь сделать это в проекте библиотеки (по сравнению с обычным проектом приложения для Android)? Полностью ButterKnife не будет работать внутри библиотечных проектов, потому что их R.id не являются окончательными. 2-й вопрос, вы подклассифицируете этот фрагмент и ожидаете, что это сработает? У меня такое ощущение, что аннотации ButterKnife (например, OttoBus) действительны только для фактического экземпляра класса. Если вы создаете подкласс этого фрагмента, попробуйте повторно реализовать метод someButtonOnClick (с аннотацией) в подклассе, чтобы подтвердить проблему.   -  person Geoff    schedule 09.06.2014
comment
Покажи мне свой R.layout.foo   -  person Than    schedule 09.06.2014
comment
Нет, это не часть библиотеки, и мой класс Fragment не является подклассом какого-либо другого класса, кроме Fragment.   -  person Perry Hoekstra    schedule 10.06.2014
comment
Я также попытался поместить ButterKnife.inject(this) в onCreate Activity, думая, что ButterKnife нужен для содержащего его действия, но, увы, радости не было. Я до сих пор не могу заставить его работать с фрагментами, просто с Activity.   -  person Perry Hoekstra    schedule 11.06.2014
comment
какое решение вы получите для этого, я также сталкиваюсь с тем же   -  person EminenT    schedule 03.12.2015


Ответы (4)


Для последней версии ButterKnife 8.0.1, июнь-2016 г.

InjectView и inject были заменены на BindView и bind Это следующие шаги:

голос против непринятия Со страницы Butterknife github:

Добавьте это к себе build.gradle уровня проекта:

buildscript {
  repositories {
    mavenCentral()
   }
  dependencies {
    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
  }
}

Добавьте это в свой build.gradle уровня модуля:

apply plugin: 'android-apt'

android {
  ...
}

dependencies {
  compile 'com.jakewharton:butterknife:8.0.1'
  apt 'com.jakewharton:butterknife-compiler:8.0.1'
}

А затем используйте Butterknife вот так

 private Unbinder unbinder;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View calcView = inflater.inflate(R.layout.content_main, container, false);

        unbinder = ButterKnife.bind(this, calcView);

        return calcView;
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        unbinder.unbind();
    }


    @OnClick(R.id.one)
    public void one() {

        Toast.makeText(getActivity(), "Working", Toast.LENGTH_SHORT).show();
        result.setText(result.getText().toString() + 1);
    }
person Hitesh Sahu    schedule 07.06.2016
comment
Я получаю Не удалось найти «com.neenbedankt.gradle.plugins: android-apt: 1.8» - person Ricardo; 07.06.2016
comment
Упс, я забыл добавить mavenCentral(). - person Ricardo; 07.06.2016
comment
Что такое Анбиндер? он говорит, что не может символ распознавателя; Кстати, ButterKnife.bind() возвращает void!! - person DJphy; 14.06.2016
comment
Это описано в документе по использованию масляного ножа jakewharton.github.io/butterknife , найдите тему 'BINDING RESET '. Вы также можете прочитать github.com/JakeWharton/butterknife/issues/291. - person Hitesh Sahu; 15.06.2016

Просто используйте эту структуру:

@OnClick(R.id.some_btn)
public void someButtonOnClick(View view) {
    // do something
}

Это описано здесь http://developer.android.com/reference/android/R.attr.html#onClick

person user3579059    schedule 02.02.2015

Это работает для меня:

@Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_home, container, false);
    ButterKnife.bind(getActivity(), view);
    return view;
}
person Jonathan Nolasco Barrientos    schedule 26.02.2017

Если у вас все еще есть проблема. Очистите проект и попробуйте запустить. Это должно исправить. Если у вас все еще есть проблема, вызовите someButtonOnClick() в onCreate и запустите, удалите ее и снова запустите. Он должен работать. Это сработало для меня.

person dhiku    schedule 02.07.2014