Я совершенно новичок в разработке для 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
Фрагмент слайдера карты внутри фрагмента ⇐ Android
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение