<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.018" />
<com.google.android.material.tabs.TabLayout
android:id="@+id/tablayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintBottom_toTopOf="@+id/viewpager"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView3">
</com.google.android.material.tabs.TabLayout>
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="96dp"
tools:layout_editor_absoluteX="0dp" />
public class MainActivity extends AppCompatActivity {
private String[] pages = {"First Screen", "Second Screen", "Third Screen"};
private ViewPager2 viewPager2;
private TabLayout tablayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// tab sync (2b)
ViewPager2.OnPageChangeCallback pageChangeCallback = new ViewPager2.OnPageChangeCallback() {
@Override
public void onPageSelected(int position) {
super.onPageSelected(position);
tablayout.selectTab(tablayout.getTabAt(position));
}
};
viewPager2 = findViewById(R.id.viewpager);
viewPager2.setAdapter(new MyViewPager2Adapter(pages));
viewPager2.registerOnPageChangeCallback(pageChangeCallback);
// removing toolbar elevation
getSupportActionBar().setElevation(0);
// attaching tab mediator
tablayout = findViewById(R.id.tablayout);
tablayout.addTab(tablayout.newTab().setText("First"));
tablayout.addTab(tablayout.newTab().setText("Second"));
tablayout.addTab(tablayout.newTab().setText("Third"));
// tab sync (1)
//new TabLayoutMediator(tablayout, viewPager2, (tab, position) -> tab.setText(pages[position])).attach();
/*new TabLayoutMediator(tablayout, viewPager2,
new TabLayoutMediator.TabConfigurationStrategy() {
@Override
public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {
tab.setText(pages[position]);
}
}).attach();*/
// tab sync (2a)
tablayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
viewPager2.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
}
}
implementation 'com.tbuonomo:dotsindicator:4.2'
<com.tbuonomo.viewpagerdotsindicator.SpringDotsIndicator
android:id="@+id/spring_dots_indicator"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
app:dampingRatio="0.75"
app:dotsColor="@color/white"
app:dotsCornerRadius="8dp"
app:dotsSize="16dp"
app:dotsSpacing="6dp"
app:dotsStrokeColor="@color/black"
app:dotsStrokeWidth="2dp"
app:layout_constraintBottom_toBottomOf="@+id/viewpager"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:stiffness="300" />
import com.tbuonomo.viewpagerdotsindicator.SpringDotsIndicator;
...
SpringDotsIndicator springDotsIndicator = (SpringDotsIndicator) findViewById(R.id.spring_dots_indicator);
springDotsIndicator.setViewPager2(viewPager2);
...
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/vv_vpViewpager2"
ID change
android:id="@+id/vv_tvTitle"
android:id="@+id/vv_tbTabs"
Remove FAB
ID change android:id="@+id/vv_constraintLayout" android:id="@+id/vv_tvFragLabel"
<string name="rstr_tab_text_1">Red
<string name="rstr_tab_text_2">Green
<string name="rstr_tab_text_3">Blue
<string name="rstr_tab_text_4">Magenta
public class MainActivity extends AppCompatActivity {
private ActivityMainBinding cv_binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
cv_binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(cv_binding.getRoot());
MyPager2Adapter lv_pagerAdapter = new MyPager2Adapter(this);
ViewPager2 lv_viewPager2 = cv_binding.vvVpViewpager2;
lv_viewPager2.setAdapter(lv_pagerAdapter);
TabLayout lv_tabs = cv_binding.vvTbTabs;
new TabLayoutMediator(lv_tabs, lv_viewPager2,
new TabLayoutMediator.TabConfigurationStrategy() {
@Override
public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {
// instead of tab.setText() at onCreate()
tab.setText(lv_pagerAdapter.cf_getTabTitle(position));
}
}).attach();
}
}
public class MyPageViewModel extends ViewModel {
private MutableLiveData<Integer> mv_mIndex = new MutableLiveData<>();
private LiveData<String> mv_mText = Transformations.map(mv_mIndex, new Function<Integer, String>() {
@Override
public String apply(Integer input) {
return "Page " + input + " is selected";
}
});
public void mf_setIndex(int index) {
mv_mIndex.setValue(index);
}
public LiveData<String> mf_getText() {
return mv_mText;
}
}
public class MyPlaceholderFragment extends Fragment {
// for 'passing intent/fragment parameter' to bundle
private static final String ARG_TAB_NUMBER = "tab_number+1";
private static final String ARG_BG_COLOR = "tab_bgcolor";
private MyPageViewModel cv_pageViewModel;
private FragmentMainBinding cv_binding;
// return MyPlaceholderFragment.newInstance(position + 1);
public static MyPlaceholderFragment cf_newInstance(int index, String bg) {
MyPlaceholderFragment lv_fragment = new MyPlaceholderFragment();
Bundle lv_bundle = new Bundle();
lv_bundle.putInt(ARG_TAB_NUMBER, index);
lv_fragment.setArguments(lv_bundle);
lv_bundle.putString(ARG_BG_COLOR, bg);
lv_fragment.setArguments(lv_bundle);
return lv_fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
cv_pageViewModel = new ViewModelProvider(this).get(MyPageViewModel.class);
int lv_index = 1;
if (getArguments() != null) {
lv_index = getArguments().getInt(ARG_TAB_NUMBER);
}
cv_pageViewModel.mf_setIndex(lv_index);
}
@Override
public View onCreateView(
@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
cv_binding = FragmentMainBinding.inflate(inflater, container, false);
View lv_root = cv_binding.getRoot();
final TextView lv_textView = cv_binding.vvTvFragLabel;
cv_pageViewModel.mf_getText().observe(getViewLifecycleOwner(), new Observer<String>() {
@Override
public void onChanged(@Nullable String s) {
lv_textView.setText(s);
lv_textView.setTextColor(Color.WHITE);
// tricky -- get color string from MyPager2Adapter->cf_getTabTitle()
if (getArguments() != null) {
String lv_color = getArguments().getString(ARG_BG_COLOR);
lv_root.setBackgroundColor(Color.parseColor(lv_color.toLowerCase()));
//// Alternative approach, define Color[]={Color.RED, ...}
//// Color[ getArguments().getInt(ARG_TAB_NUMBER) ]
}
}
});
return lv_root;
}
@Override
public void onDestroyView() {
super.onDestroyView();
cv_binding = null;
}
}
import android.content.Context;
import androidx.annotation.StringRes;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.viewpager2.adapter.FragmentStateAdapter;
import com.example.a14_pager.R;
public class MyPager2Adapter extends FragmentStateAdapter {
Context cv_context;
@StringRes
private final int[] TAB_TITLES = new int[]{R.string.rstr_tab_text_1,
R.string.rstr_tab_text_2, R.string.rstr_tab_text_3, R.string.rstr_tab_text_4};
public MyPager2Adapter(FragmentActivity fa) {
super(fa);
cv_context = fa.getApplicationContext();
}
@Override
public Fragment createFragment(int position) {
// [] index from 0, "Page 1-4 is selected"
return MyPlaceholderFragment.cf_newInstance(position+1, cf_getTabTitle(position));
}
@Override
public int getItemCount() {
return TAB_TITLES.length;
}
public String cf_getTabTitle(int position) {
return cv_context.getResources().getString(TAB_TITLES[position]);
}
}
Lambda Expressions in GUI Applications https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html btn.setOnAction(new EventHandler() { @Override public void handle(ActionEvent event) { System.out.println("Hello World!"); } }); btn.setOnAction( event -> System.out.println("Hello World!") );