Как перейти от фрагмента к действию по клику ImageView? - PullRequest
0 голосов
/ 06 июля 2019

Я новичок в разработке для 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, но я получаю сообщение об ошибке при попытке объявить что-либо во фрагменте

Ответы [ 3 ]

0 голосов
/ 06 июля 2019

Вы должны надуть представление в 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;
    }
}
0 голосов
/ 06 июля 2019

При работе с фрагментом вы не можете вызвать findviewbyid () в onCreate (), как вы это делаете в Activity, поскольку фрагмент создан в onCreate (), но пользовательский интерфейс еще не отрисован ( Подробнее о фрагменте ). Вы можете сделать это в 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);
        }
    });
}
0 голосов
/ 06 июля 2019

Вы должны позвонить findViewById() из раздутого представления в пределах onCreateView из Фрагмента .Пример:

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;
    }
}
...