Фрагмент слайдера карты внутри фрагментаAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Фрагмент слайдера карты внутри фрагмента

Сообщение Anonymous »

Я совершенно новичок в разработке для Android, и этот вопрос может показаться глупым, но я пытаюсь реализовать слайдер карты внутри фрагмента в Android. Моя цель — обеспечить плавное скольжение карточек в зависимости от жестов прокрутки пользователя. Эта функциональность отлично работает при реализации в действии, но не работает должным образом при использовании внутри фрагмента.
Чтобы настроить это, я добавил ViewPager в файл макета фрагмента (fragment_home.xml) и инициализировал его в методе onCreateView фрагмента. Я использую специальный адаптер (CardPagerAdaptor) для заполнения карточек данными и класс ShadowTransformer для обработки эффектов масштабирования и возвышения во время прокрутки. Хотя та же настройка работает и в действии, карточки внутри фрагмента отображаются, но не перемещаются, когда пользователь пытается прокрутить.
Я добавил журналы отладки, чтобы убедиться, что адаптер получает данные и что ViewPager правильно инициализирован. Я подозреваю, что проблема может быть связана с обработкой событий касания или различиями в жизненном цикле между фрагментами и действиями. Мне также интересно, может ли координаторLayout или родительские макеты мешать сенсорным жестам.
Не могли бы вы помочь мне понять, почему ViewPager работает неправильно в фрагмент и как это решить? Кроме того, если для достижения этой цели есть способ реализовать один фрагмент внутри другого фрагмента, я был бы признателен за ваши рекомендации. Если есть лучшие альтернативы реализации выдвижных карточек во фрагменте, я был бы готов изучить и их.

// HomeFragment

package com.example.cricketliveapp.Fragments;

import android.content.Context;
import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.viewpager.widget.ViewPager;

import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.example.cricketliveapp.Adaptors.CardPagerAdaptor;
import com.example.cricketliveapp.CardItem;
import com.example.cricketliveapp.R;
import com.example.cricketliveapp.ShadowTransformer;

public class HomeFragment extends Fragment {

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
Log.d("HomeFragment", "ViewPager Initialized");
View rootView = inflater.inflate(R.layout.fragment_home, container, false);
ViewPager mViewPager = rootView.findViewById(R.id.main_carousel_container);
Log.d("card initialised", "initialised");

CardPagerAdaptor mCardAdapter = new CardPagerAdaptor();
for (int i = 0; i < 5; i++) {
mCardAdapter.addCardItem(new CardItem(
"Match " + (i + 1),
"Date " + (i + 1),
"• Time " + (i + 1),
"Team 1 " + (i + 1),
"100-3",
"Team 2 " + (i + 1),
"90-5",
"15.0",
"14.5",
"Live match message",
R.drawable.sa_flag,
R.drawable.second_flag
));
}

ShadowTransformer mCardShadowTransformer = new ShadowTransformer(mViewPager, mCardAdapter);
mCardShadowTransformer.enableScaling(true);
mViewPager.setAdapter(mCardAdapter);
mViewPager.setPageTransformer(false, mCardShadowTransformer);
mViewPager.setOffscreenPageLimit(3);

return rootView;
}
}

// MainActivity

package com.example.cricketliveapp;

import android.os.Bundle;

import com.example.cricketliveapp.Adaptors.PagerAdaptor;
import com.google.android.material.snackbar.Snackbar;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Handler;
import android.util.Log;
import android.view.View;

import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;
import androidx.viewpager.widget.ViewPager;
import androidx.viewpager2.adapter.FragmentStateAdapter;
import androidx.viewpager2.widget.ViewPager2;

import com.example.cricketliveapp.databinding.ActivityMainBinding;
import com.google.android.material.tabs.TabLayout;
import com.google.android.material.tabs.TabLayoutMediator;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

private TabLayout tabLayout_main;
private ViewPager2 viewpage_main;
private PagerAdaptor pagerAdaptor;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

tabLayout_main = findViewById(R.id.tab_main_layout);
viewpage_main = findViewById(R.id.view_main_pagger);

FragmentManager fragmentManager = getSupportFragmentManager();
pagerAdaptor = new PagerAdaptor(fragmentManager, getLifecycle());
viewpage_main.setAdapter(pagerAdaptor);

tabLayout_main.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
viewpage_main.setCurrentItem(tab.getPosition());
}

@Override
public void onTabUnselected(TabLayout.Tab tab) {

}

@Override
public void onTabReselected(TabLayout.Tab tab) {

}
});

viewpage_main.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
@Override
public void onPageSelected(int position) {
tabLayout_main.selectTab(tabLayout_main.getTabAt(position));
}
});

new TabLayoutMediator(tabLayout_main, viewpage_main, (tab, position) -> {
if(position == 0) {
tab.setText("Home");
Log.d("HomeFragment", "Fragment View Created");
} else {
tab.setText("Live");
}
}).attach();
}

}

// ShadowTransformer

package com.example.cricketliveapp;

import android.util.Log;
import android.view.View;

import androidx.cardview.widget.CardView;
import androidx.viewpager.widget.ViewPager;

import com.example.cricketliveapp.Adaptors.CardAdaptor;

public class ShadowTransformer implements ViewPager.OnPageChangeListener, ViewPager.PageTransformer {
private final ViewPager mViewPager;
private final CardAdaptor mAdapter;
private float mLastOffset;
private boolean mScalingEnabled;

public ShadowTransformer(ViewPager viewPager, CardAdaptor adapter) {
mViewPager = viewPager;
mAdapter = adapter;
mViewPager.addOnPageChangeListener(this);
}

public void enableScaling(boolean enable) {
if (mScalingEnabled && !enable) {

CardView currentCard = mAdapter.getCardViewAt(mViewPager.getCurrentItem());
if (currentCard != null) {
currentCard.animate().scaleY(1);
currentCard.animate().scaleX(1);
}
}else if(!mScalingEnabled && enable){

CardView currentCard = mAdapter.getCardViewAt(mViewPager.getCurrentItem());
if (currentCard != null) {
currentCard.animate().scaleY(2f);
currentCard.animate().scaleX(2f);
}
}

mScalingEnabled = enable;
}

@Override
public void transformPage(View page, float position) {

}

@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
Log.d("scroll message", "scrolled");
int realCurrentPosition;
int nextPosition;
float baseElevation = mAdapter.getBaseElevation();
float realOffset;
boolean goingLeft = mLastOffset > positionOffset;

if (goingLeft) {
realCurrentPosition = position + 1;
nextPosition = position;
realOffset = 1 - positionOffset;
} else {
nextPosition = position + 1;
realCurrentPosition = position;
realOffset = positionOffset;
}

if (nextPosition > mAdapter.getCount() - 1
|| realCurrentPosition > mAdapter.getCount() - 1) {
return;
}

Log.d("scrolled", String.valueOf(realCurrentPosition));

CardView currentCard = mAdapter.getCardViewAt(realCurrentPosition);

if (currentCard != null) {
if (mScalingEnabled) {
currentCard.setScaleX((float) (1 + 0.1 * (1 - realOffset)));
currentCard.setScaleY((float) (1 + 0.1 * (1 - realOffset)));
}
currentCard.setCardElevation((baseElevation + baseElevation
* (CardAdaptor.MAX_ELEVATION_FACTOR - 1) * (1 - realOffset)));
}

CardView nextCard = mAdapter.getCardViewAt(nextPosition);

if (nextCard != null) {
if (mScalingEnabled) {
nextCard.setScaleX((float) (1 + 0.1 * (realOffset)));
nextCard.setScaleY((float) (1 + 0.1 * (realOffset)));
}
nextCard.setCardElevation((baseElevation + baseElevation
* (CardAdaptor.MAX_ELEVATION_FACTOR - 1) * (realOffset)));
}

mLastOffset = positionOffset;
}

@Override
public void onPageSelected(int position) {

}

@Override
public void onPageScrollStateChanged(int state) {

}

}


Подробнее здесь: https://stackoverflow.com/questions/793 ... a-fragment
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»