【问题标题】:How do I navigate from a fragment to an activity on ImageView click?如何从片段导航到 ImageView 单击上的活动?
【发布时间】:2019-11-16 13:29:42
【问题描述】:

我是 android 开发的初学者,我想在单击 ImageView 中的图像时从片段导航到活动。我的 Java 类不允许我声明变量以链接到我的 XML 文件。另外,我不确定我应该在哪个 java 类中声明我的变量。

我也尝试在我的 MainActivity 中编写相同的代码,但它仍然显示错误。

public class HomeFragment extends Fragment{
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable 
ViewGroup container, @Nullable Bundle savedInstanceState) {
    return inflater.inflate(R.layout.fragment_home,container,false);
}

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

    edSheeranSongs = (ImageView)findViewById(R.id.ed_sheeran);
    justinBieberSongs = (ImageView)findViewById(R.id.justin_bieber);
    shawnMendesSongs = (ImageView)findViewById(R.id.shawn_mendes);

    edSheeranSongs.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent(getActivity(),SheeranSongs.class);
            startActivity(intent);

        }
    });

我希望去另一个我已经创建的名为 SheeranSongs 的活动,但是当我尝试在片段中声明任何内容时收到一条错误消息

【问题讨论】:

  • 您可以更新帖子以包含您收到的错误吗?
  • 把你的oncreate代码放在onCreateView中

标签: android android-studio android-fragments android-intent


【解决方案1】:

使用片段时,您不能像在 Activity 中那样在 onCreate() 中调用 findviewbyid(),因为片段是在 onCreate() 中创建的,但尚未绘制用户界面 (More about fragment)。 您可以在 onCreateView() 或 onViewCreated() 中执行此操作。从我的角度来看,我是在 onViewCreated() 中进行的,所以它看起来更干净一些。

public class HomeFragment extends Fragment{
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    return inflater.inflate(R.layout.fragment_home,container,false);
}

public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    ImageView edSheeranSongs = view.findViewById(R.id.ed_sheeran);
    ImageView justinBieberSongs = view.findViewById(R.id.justin_bieber);
    ImageView shawnMendesSongs = view.findViewById(R.id.shawn_mendes);

    edSheeranSongs.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent(requireActivity(), SheeranSongs.class);
            startActivity(intent);
        }
    });
}

【讨论】:

    【解决方案2】:

    您应该为片段的onCreateView 中的视图充气,并使用创建的自定义视图初始化视图。覆盖onAttach 以获取片段所附加到的活动的上下文。

    public class HomeFragment extends Fragment{
    
    private Context context;
      @Override
        public void onAttach(Context context) {
            super.onAttach(context);
            this.context=context;
        }
    
        @Nullable
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.fragment_home, container, false);
    
            edSheeranSongs = view.findViewById(R.id.ed_sheeran);
            justinBieberSongs = view.findViewById(R.id.justin_bieber);
            shawnMendesSongs = view.findViewById(R.id.shawn_mendes);
    
            edSheeranSongs.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Intent intent = new Intent(context, SheeranSongs.class);
                    startActivity(intent);
                }
            });
            return view;
        }
    }
    

    【讨论】:

    • 工作就像一个魅力。非常感谢
    • Sidharath Aggarwal 。请单击旁边的复选标记将答案标记为正确,谢谢!
    • 没有必要通过覆盖onAttach()来获取上下文,看我的答案更短=)@SidharathAggarwal
    【解决方案3】:

    您应该从 FragmentonCreateView 内的膨胀视图 调用findViewById()。示例:

    public class HomeFragment extends Fragment{
        @Nullable
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.fragment_home, container, false);
    
            edSheeranSongs = view.findViewById(R.id.ed_sheeran);
            justinBieberSongs = view.findViewById(R.id.justin_bieber);
            shawnMendesSongs = view.findViewById(R.id.shawn_mendes);
    
            edSheeranSongs.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Intent intent = new Intent(requireContext(), SheeranSongs.class);
                    startActivity(intent);
                }
            });
            return view;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多