黄油刀碎片按钮不起作用
Posted
技术标签:
【中文标题】黄油刀碎片按钮不起作用【英文标题】:Butterknife Fragment Button not working 【发布时间】:2014-07-30 08:02:24 【问题描述】:我有一个正在使用 Butterknife 的 Fragment。
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_
android:layout_
android:orientation="vertical"
android:background="@color/White">
<LinearLayout
android:layout_
android:layout_
android:orientation="horizontal">
<Button
android:id="@+id/some_btn"
android:layout_
android:layout_
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_
android:layout_
android:layout_weight="1"
android:layout_margin="@dimen/xsmall_margin"
android:background="@drawable/some_other_btn_selection" />
</LinearLayout>
</LinearLayout>
【问题讨论】:
可能不相关(因为它会导致编译错误),但是您是否有机会尝试在库项目中执行此操作(与普通的 android 应用程序项目相比)? ButterKnife flat-out 在图书馆项目中不起作用,因为他们的 R.id 不是最终的。第二个问题,您是否将此片段子类化并期望它起作用?我觉得 ButterKnife 注释(如 OttoBus)仅在被实例化的实际类上有效。如果您要对此片段进行子类化,请尝试在子类中重新实现 someButtonOnClick 方法(带有注释)以确认问题。 给我看 R.layout.foo 不,它不是库的一部分,我的 Fragment 类也不是 Fragment 以外的任何类的子类。 我还尝试在 Activity 的 onCreate 中放置一个 ButterKnife.inject(this),认为 ButterKnife 需要它来包含 Activity,但很可惜,没有乐趣。我仍然无法让它为 Fragments 工作,只是 Activity。 你得到什么解决方案,我也面临同样的问题 【参考方案1】:适用于最新的 ButterKnife 8.0.1 June -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);
【讨论】:
我越来越找不到'com.neenbedankt.gradle.plugins:android-apt:1.8' Ups,我忘了添加 mavenCentral()。 瓦特解绑器?它说不能解析器符号;顺便说一句 ButterKnife.bind() 返回无效! 在butterknife使用文档jakewharton.github.io/butterknife中有描述,搜索主题'BINDING RESET'。你也可以阅读github.com/JakeWharton/butterknife/issues/291【参考方案2】:只需使用这个结构:
@OnClick(R.id.some_btn)
public void someButtonOnClick(View view)
// do something
这里有描述http://developer.android.com/reference/android/R.attr.html#onClick
【讨论】:
【参考方案3】:这对我有用:
@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;
【讨论】:
【参考方案4】:如果您仍有问题。清理项目并尝试运行。它应该修复。如果您仍然有问题,请在onCreate
中调用someButtonOnClick()
并运行并删除它,然后再次运行它。它应该工作。它对我有用。
【讨论】:
以上是关于黄油刀碎片按钮不起作用的主要内容,如果未能解决你的问题,请参考以下文章