Um dies einzurichten, habe ich einen ViewPager in hinzugefügt Layoutdatei des Fragments (
Code: Select all
fragment_home.xml
Code: Select all
CardPagerAdaptor
Ich habe Debug-Protokolle hinzugefügt, um zu überprüfen, ob der Adapter empfängt Daten und dass der ViewPager korrekt initialisiert ist. Ich vermute, dass das Problem mit der Handhabung von Berührungsereignissen oder Lebenszyklusunterschieden zwischen Fragmenten und Aktivitäten zusammenhängen könnte. Ich frage mich auch, ob das CoordinatorLayout oder übergeordnete Layouts möglicherweise Berührungsgesten beeinträchtigen.
Könnten Sie mir bitte helfen zu verstehen, warum der ViewPager im nicht richtig funktioniert? Fragment und wie kann man das beheben? Wenn es darüber hinaus eine Möglichkeit gibt, ein Fragment innerhalb eines anderen Fragments zu implementieren, um dies zu erreichen, würde ich mich über Ihre Anleitung freuen. Wenn es bessere Alternativen für die Implementierung von Schiebekarten in einem Fragment gibt, wäre ich offen dafür, diese ebenfalls zu erkunden.
Code: Select all
// 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) {
}
}