【问题标题】:setOnClickListener FloatingActionButton on Fragment Error片段错误上的 setOnClickListener FloatingActionButton
【发布时间】:2016-03-23 21:48:00
【问题描述】:

我是 Android Studio 中 FragmentFloatingActionButtons 的新手。我一直在尝试使用setOnClickListener 获取FloatingActionButton,但每次运行程序时都会收到一条错误消息,我无法弄清楚如何修复。我知道这里还有很多其他问题都有同样的问题,尽管我已经解决了这些问题但仍然无法弄清楚,我是这方面的新手,提前感谢您的所有帮助。

这是FloatingActionButton 的 XML 代码:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.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:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
xmlns:fab="http://schemas.android.com/apk/res-auto"
tools:context="com.example.user.health.IceOneActivity">

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:popupTheme="@style/AppTheme.PopupOverlay" />

</android.support.design.widget.AppBarLayout>

<include layout="@layout/content_ice_one" />

<android.support.v4.view.ViewPager
    android:id="@+id/viewpager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />

<android.support.design.widget.FloatingActionButton
    android:id="@+id/editInfo"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginBottom="230dp"
    android:layout_gravity="bottom|end"
    android:layout_marginRight="@dimen/fab_margin"
    android:visibility="invisible"
    app:backgroundTint="@color/colorFAB3"
    app:elevation="6dp"
    app:pressedTranslationZ="12dp"
    app:fab_title="Edit"
    android:src="@drawable/ic_create_white_24dp" />
<android.support.design.widget.FloatingActionButton
    android:id="@+id/saveInfo"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginBottom="160dp"
    android:layout_gravity="bottom|end"
    android:layout_marginRight="@dimen/fab_margin"
    android:visibility="invisible"
    app:elevation="6dp"
    app:backgroundTint="@color/colorFAB2"
    app:pressedTranslationZ="12dp"
    app:fab_title="Save"
    android:src="@drawable/ic_save_white_24dp" />
<android.support.design.widget.FloatingActionButton
    android:id="@+id/showInfo"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginBottom="90dp"
    android:layout_gravity="bottom|end"
    android:layout_marginRight="@dimen/fab_margin"
    android:visibility="invisible"
    app:elevation="6dp"
    app:backgroundTint="@color/colorFAB1"
    app:pressedTranslationZ="12dp"
    fab:fab_title="Done"
    android:src="@drawable/ic_check_white_24dp" />
<android.support.design.widget.FloatingActionButton
    android:id="@+id/moreInfo"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom|end"
    app:elevation="6dp"
    app:backgroundTint="@color/colorAccent"
    app:pressedTranslationZ="12dp"
    android:layout_margin="@dimen/fab_margin"
    android:src="@drawable/ic_add_white_24dp" />

这里是java活动:

public class IceOneActivity extends Fragment implements View.OnClickListener {

private Boolean isFabOpen = false;
private FloatingActionButton moreInfo,saveInfo,editInfo,showInfo;
private Animation fab_open,fab_close,rotate_forward,rotate_backward;

public IceOneActivity() {
    // Required empty public constructor
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

}

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

    //myFragmentView
    moreInfo = (FloatingActionButton) inflater.inflate(R.layout.content_ice_one, container, false).findViewById(R.id.moreInfo);
    saveInfo = (FloatingActionButton) inflater.inflate(R.layout.content_ice_one, container, false).findViewById(R.id.saveInfo);
    editInfo = (FloatingActionButton) inflater.inflate(R.layout.content_ice_one, container, false).findViewById(R.id.editInfo);
    showInfo = (FloatingActionButton) inflater.inflate(R.layout.content_ice_one, container, false).findViewById(R.id.showInfo);
    fab_open = AnimationUtils.loadAnimation(getActivity(), R.anim.fab_open);
    fab_close = AnimationUtils.loadAnimation(getActivity(),R.anim.fab_close);
    rotate_forward = AnimationUtils.loadAnimation(getActivity(),R.anim.rotate_forward);
    rotate_backward = AnimationUtils.loadAnimation(getActivity(), R.anim.rotate_backward);
    moreInfo.setOnClickListener(this);
    saveInfo.setOnClickListener(this);
    editInfo.setOnClickListener(this);
    showInfo.setOnClickListener(this);

    return iceOneView;
}

@Override
public void onClick(View v) {
    int id = v.getId();
    switch (id){
        case R.id.moreInfo:

            animateFAB();
            break;
        case R.id.saveInfo:

            Log.d("1", "Fab 1");
            break;
        case R.id.editInfo:

            Log.d("2", "Fab 2");
            break;
        case R.id.showInfo:

            Log.d("3", "Fab 3");
            break;
    }
}

这是我尝试运行活动时应用程序的 Logcat:

Process: com.example.user.health, PID: 13237
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.design.widget.FloatingActionButton.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
at com.example.user.health.IceOneActivity.onCreateView(IceOneActivity.java:44)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:1962)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1613)
at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:570)
at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
at android.support.v4.view.ViewPager.populate(ViewPager.java:1106)
at android.support.v4.view.ViewPager.populate(ViewPager.java:952)
at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1474)
at android.view.View.measure(View.java:18893)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5966)
at android.support.design.widget.CoordinatorLayout.onMeasureChild(CoordinatorLayout.java:610)
at android.support.design.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.java:677)
at android.view.View.measure(View.java:18893)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5966)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:135)
at android.view.View.measure(View.java:18893)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5966)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:748)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:630)
at android.view.View.measure(View.java:18893)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5966)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at android.view.View.measure(View.java:18893)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5966)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:748)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:630)
at android.view.View.measure(View.java:18893)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5966)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at com.android.internal.policy.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2693)
at android.view.View.measure(View.java:18893)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2192)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1271)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1510)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1162)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6229)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:873)
at android.view.Choreographer.doCallbacks(Choreographer.java:676)
at android.view.Choreographer.doFrame(Choreographer.java:606)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:859)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:168)
at android.app.ActivityThread.main(ActivityThread.java:5845)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:797)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687)

【问题讨论】:

    标签: android android-studio android-fragmentactivity floating-action-button


    【解决方案1】:

    您只需膨胀一次视图。就是这一行(在 IceOneActivity 内):

    View iceOneView = inflater.inflate(R.layout.content_ice_one, container, false);
    

    然后,您可以从这个膨胀的视图中获取对您的 FloatingActionButton 实例的引用:

    moreInfo = (FloatingActionButton) iceOneView.findViewById(R.id.moreInfo);
    saveInfo = (FloatingActionButton) iceOneView.findViewById(R.id.saveInfo);
    editInfo = (FloatingActionButton) iceOneView.findViewById(R.id.editInfo);
    showInfo = (FloatingActionButton) iceOneView.findViewById(R.id.showInfo);
    

    【讨论】:

    • 感谢您的帮助,我已经按照您说的做了,尽管我仍然收到此错误:java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.design.widget.FloatingActionButton.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
    • @geek101 您在上面发布的 xml 文件的名称是什么?是content_ice_one吗?
    • 上面贴的xml文件是app_bar_ice_one.xml,但content_ice_one是内容所在。
    • @geek101 您是否应该改用View iceOneView = inflater.inflate(R.layout.app_bar_ice_one, container, false);?我可以看到 content_ice_one 包含在该文件中。问题是您正在膨胀的布局实际上并不包含您试图获取引用的 FloatingActionButtons。
    • 解决了!非常感谢,我已经在这几个小时了。
    【解决方案2】:

    您不必使用它一次又一次地膨胀片段视图 -

    inflater.inflate(R.layout.content_ice_one, container, false)
    

    你已经做过一次了 -

    View iceOneView = inflater.inflate(R.layout.content_ice_one, container, false);
    

    您应该使用 iceOneView 来实例化按钮,使用 -

      moreInfo = (FloatingActionButton) iceOneView.findViewById(R.id.moreInfo);
    

    【讨论】:

      【解决方案3】:

      FloatingActionButton 放置在 activity 布局中,并且您正在从片段布局中对其进行膨胀,这就是您得到空指针异常的原因,您不必这样做,只需从活动中调用它:

       moreInfo = (FloatingActionButton)getActivity().findViewById(R.id.moreInfo);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-14
        • 1970-01-01
        • 1970-01-01
        • 2022-08-02
        • 1970-01-01
        • 2014-05-07
        • 1970-01-01
        相关资源
        最近更新 更多