Я создаю приложение для бюджетирования в Android. В настоящее время я пытаюсь использовать fragments
для отображения всех текущих кошельков пользователей (один фрагмент на кошелек). Каждый fragment
будет занимать весь экран и использовать TabLayout
в верхней части экрана для навигации. Поскольку мои fragments
отображают данные, которые будут часто меняться, они должны быть динамическими c. Проблема сейчас в том, что они создаются (я вижу их в FragmentManager
, используя точки останова и c), однако они не отображаются в ViewPager
или TabLayout
.
Мой XML код для основного действия:
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.viewpager.widget.ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<com.google.android.material.tabs.TabLayout
android:id="@+id/tabLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:elevation="4dp"
android:minHeight="?attr/actionBarSize"
android:background="@color/colorTest"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:tabGravity="fill"
app:tabMode="fixed" />
<Button
android:id="@+id/createWallet"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Create wallet"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/currentFragment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="Current Fragment"
app:layout_constraintBottom_toBottomOf="@+id/createWallet"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
Мой код для создания fragments
и связывания ViewPager
и TabLayout
вместе в MainActivity
:
ViewPager viewPager = findViewById(R.id.pager);
ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager(), MainActivity.this);
viewPager.setAdapter(viewPagerAdapter);
TabLayout tabLayout = findViewById(R.id.tabLayout);
tabLayout.setupWithViewPager(viewPager);
public void loadFragments()
{
ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager(), MainActivity.this);
for (int i = 0; i < walletList.size(); i++)
{
WalletClass object = walletList.get(i);
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragment frag = new fragment().newInstance(object);
fragmentTransaction.add(R.id.pager, frag, "fragment" + i);
viewPagerAdapter.addFragment(frag);
fragmentTransaction.commit();
}
}
Мой код класса фрагмента:
public fragment newInstance(WalletClass wallet)
{
fragment frag = new fragment();
Bundle bundle = new Bundle();
bundle.putString("walletName", wallet.getWalletName());
bundle.putInt("walletBalance", wallet.getBalance());
frag.setArguments(bundle);
return frag;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Bundle bundle = getArguments();
Toast.makeText(getContext(), "" + bundle.getString("walletName"), Toast.LENGTH_SHORT).show();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_layout, container, false);
Bundle bundle = getArguments();
TextView walletName = view.findViewById(R.id.walletName);
walletName.setText(bundle.getString("walletName"));
return view;
}
И мой код для адаптера ViewPager
. Этот код, в основном, взят из других интерактивных учебных пособий, которые, по сути, должны быть переработаны, я думаю:
List<fragment> fragmentList = new ArrayList<>();
List<String> fragmentNameList = new ArrayList<>();
private Context context;
public ViewPagerAdapter(FragmentManager fm, Context context)
{
super(fm);
this.context = context;
}
@Override
public fragment getItem(int position)
{
return fragmentList.get(position);
}
public void addFragment (Fragment fragment, WalletClass wallet)
{
Bundle bundle = new Bundle();
bundle.putString("walletName", wallet.getWalletName());
bundle.putInt("walletBalance", wallet.getBalance());
fragment.setArguments(bundle);
fragmentList.add(fragment);
fragmentNameList.add(wallet.getWalletName());
}
public void removeFragment (fragment fragment)
{
fragmentList.remove(fragment);
}
@Override
public int getCount()
{
return fragmentList.size();
}
@Nullable
public CharSequence getPageTitle(int position)
{
return fragmentNameList.get(position);
}
Так что у кого-нибудь есть идеи о том, как динамически создавать fragments
с помощью * 1028? * адаптер? Или я делаю это совершенно неправильно?