0

我在Fragment的内部有一个ListView,其中包含一些歌曲。当我点击一首歌曲时,我想更改FAB中的图标(位于Activity),但我不知道该怎么做。我试着用此代码:Android - 单击ListView时单击更改FAB图标

片断:

mainActivity = new MainActivity(); //THIS IS INSIDE onCreate METHOD 

mListViewSongs.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       mainActivity.fab.setImageResource(R.drawable.vector_pause); 
     } 
    } 

我宣布我的FAB作为公共我的活动里面,但我仍然得到NullPointerException异常,我怎么能解决这个问题?

回答

1

假设你的晶圆厂在你的活动中,你需要一种方法来沟通你的碎片和你的活动。我建议遵循本指南this guide

本质上,您要定义一个接口ActivityController,其中包含您想要在活动内部运行的任何功能。这里是一个样机例如:

ActivityController.java - 一个新的界面,你将创建

public interface ActivityController { 
    void setFabImageResource(int resourceId); 
} 

MainActivity.java - 你的活动作为必要Modifiy。

public class MainActivity implements ActivityController { 
    //The rest of your code 

    public void setFabImageResource(int resourceId) { 
     fab.setImageResource(resourceId); 
    } 
} 

YourFragment.java - 只需modifiy您的片段,像这样:

mListViewSongs.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      ((ActivityController)getActivity()).setFabImageResource(R.drawable.vector_pause); 
     } 
    } 
+0

它的工作,谢谢! :) – Sabatino

1

只需更换

mainActivity.fab.setImageResource(R.drawable.vector_pause); 

通过

fab.setImageResource(R.drawable.vector_pause); 

我假设fab被声明为

FloatingActionButton fab; 

和您喜欢

fab = (FloatingActionButton) findViewById(R.id.your_fab_id_from_xml); 
它分配

在致电setContentView()onCreate()后。

请记住,您不应该自己创建活动实例。这是框架的作用,而不是你的。

+0

你可能想补充一点,你承担的工厂是该片段内。 –

+0

不是。据说它在活动中。我会更新我的答案。 –

+0

呃,我是说我的意思是活动。无论哪种方式,重要的是要指出你正在谈论哪一个 –