I am trying to create a chat app for android based on chat21 sdk app on github, with chat21 demo app also in github and the thing is that I want to add Icons to TabLayouts and I am stuck there because I tried a couple times on my own and I just can't get it to work, so here is an image of how I want my chat tabs to look,
here is tab_activity.xml code:
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
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:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/windowBackground"
tools:context=".TabActivity">
<android.support.design.widget.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<android.support.design.widget.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:background="@color/colorPrimary"
android:layout_height="wrap_content"
app:tabIndicatorColor="@color/white"
app:tabIndicatorHeight="3dp" />
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</android.support.design.widget.CoordinatorLayout>`
and here it is TabActivity in java:
package chat21.android.demo;
import android.os.Bundle;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import org.chat21.android.core.ChatManager;
import org.chat21.android.ui.ChatUI;
import java.util.HashMap;
import java.util.Map;
public class TabActivity extends AppCompatActivity {
private static final String TAG = TabActivity.class.getName();
/**
* The {@link android.support.v4.view.PagerAdapter} that will provide
* fragments for each of the sections. We use a
* {@link FragmentPagerAdapter} derivative, which will keep every
* loaded fragment in memory. If this becomes too memory intensive, it
* may be best to switch to a
* {@link android.support.v4.app.FragmentStatePagerAdapter}.
*/
private SectionsPagerAdapter mSectionsPagerAdapter;
/**
* The {@link ViewPager} that will host the section contents.
*/
private ViewPager mViewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tab);
// Create the adapter that will return a fragment for each of the three
// primary sections of the activity.
mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
// Set up the ViewPager with the sections adapter.
mViewPager = (ViewPager) findViewById(R.id.view_pager);
mViewPager.setAdapter(mSectionsPagerAdapter);
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(mViewPager);
ChatUI.getInstance().processRemoteNotification(getIntent());
}
@Override
protected void onResume() {
ChatManager.getInstance().getMyPresenceHandler().connect();
super.onResume();
}
@Override
protected void onDestroy() {
ChatManager.getInstance().getMyPresenceHandler().dispose();
super.onDestroy();
}
// @Override
// public boolean onCreateOptionsMenu(Menu menu) {
// // Inflate the menu; this adds items to the action bar if it is
present.
// getMenuInflater().inflate(R.menu.menu_tab, menu);
// return true;
// }
//
// @Override
// public boolean onOptionsItemSelected(MenuItem item) {
// // Handle action bar item clicks here. The action bar will
// // automatically handle clicks on the Home/Up button, so long
// // as you specify a parent activity in AndroidManifest.xml.
// int id = item.getItemId();
//
// //noinspection SimplifiableIfStatement
// if (id == R.id.action_settings) {
// return true;
// }
//
// return super.onOptionsItemSelected(item);
// }
/**
* A {@link FragmentPagerAdapter} that returns a fragment corresponding to
* one of the sections/tabs/pages.
*/
public class SectionsPagerAdapter extends FragmentPagerAdapter {
private int tabsCount;
private Map<String, Item> tabsMap;
private String[] tabsTags;
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
tabsMap = new HashMap<>();
// create a map with all tabs
tabsMap.put(getString(R.string.tag_home),
new Item(getString(R.string.tab_home_title), 1));
tabsMap.put(getString(R.string.tag_chat),
new Item(getString(R.string.tab_chat_title), 1));
tabsMap.put(getString(R.string.tag_profile),
new Item(getString(R.string.tab_profile_title), 1));
// retrieve tab tags
tabsTags = getResources().getStringArray(R.array.tab_tags);
tabsCount = tabsTags.length; // count tab tags
}
@Override
public Fragment getItem(int position) {
// getItem is called to instantiate the fragment for the given page.
String tabTag = getTagByPosition(position);
if (tabTag.equals(getString(R.string.tag_home))) {
return HomeFragment.newInstance();
} else if (tabTag.equals(getString(R.string.tag_chat))) {
return ChatFragment.newInstance();
} else if (tabTag.equals(getString(R.string.tag_profile))) {
return UserProfileFragment.newInstance();
} else {
// default load home
return ChatFragment.newInstance();
}
}
@Override
public int getCount() {
return tabsCount;
}
private String getTagByPosition(int position) {
return tabsTags[position];
}
private String getTitleByTag(String tag) {
return tabsMap.get(tag).getTitle();
}
private int getIconByTag(String tag) {
return tabsMap.get(tag).getIcon();
}
@Override
public CharSequence getPageTitle(int position) {
String tabTag = getTagByPosition(position);
return getTitleByTag(tabTag);
}
private class Item {
private String title;
private int icon;
private Item(String title, int icon) {
setTitle(title);
setIcon(icon);
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public int getIcon() {
return icon;
}
public void setIcon(int icon) {
this.icon = icon;
}
@Override
public String toString() {
return "Item{" +
"title='" + title + '\'' +
", icon='" + icon + '\'' +
'}';
}
}
}
}
Here is my code:
package demo.stackowerflow_demos;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.annotation.DrawableRes;
import android.support.annotation.LayoutRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.StringRes;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.content.res.AppCompatResources;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final TabLayout tab = findViewById(R.id.tab);
final ViewPager pager = findViewById(R.id.pager);
pager.setAdapter(new SectionsPagerAdapter(getSupportFragmentManager(), this));
setupTabWithViewPager(tab, pager, R.layout.tab_layout);
}
//tabs
enum Tab {
HOME(R.string.tab_home, R.drawable.ic_home),
CHAT(R.string.tab_chat, R.drawable.ic_chat),
PROFILE(R.string.tab_profile, R.drawable.ic_profile);
Tab(@StringRes int title,
@DrawableRes int icon) {
this.title = title;
this.icon = icon;
}
final @StringRes
int title;
final @DrawableRes
int icon;
static final Tab[] VALUES = values();
}
//simple interface
interface IconedTabPagerAdapter {
CharSequence getPageTitle(int position);
Drawable getPageIcon(int position);
}
//adapter for pager
static class SectionsPagerAdapter
extends FragmentPagerAdapter
implements IconedTabPagerAdapter {
private final Context mContext;
public SectionsPagerAdapter(FragmentManager fm,
Context context) {
super(fm);
mContext = context;
}
@Override
public Fragment getItem(int position) {
final Tab tab = Tab.VALUES[position];
switch (tab) {
case CHAT:
return ChatFragment.newInstance();
case PROFILE:
return UserProfileFragment.newInstance();
// default load home
case HOME:
default:
return HomeFragment.newInstance();
}
}
@Override
public int getCount() {
return Tab.VALUES.length;
}
@Override
public CharSequence getPageTitle(int position) {
final @StringRes int title = Tab.VALUES[position].title;
return mContext.getString(title);
}
@Override
public Drawable getPageIcon(int position) {
final @DrawableRes int icon = Tab.VALUES[position].icon;
return AppCompatResources.getDrawable(mContext, icon);
}
}
static void setupTabWithViewPager(@NonNull TabLayout tabLayout,
@NonNull ViewPager viewPager,
@LayoutRes int tabCustomView) {
final PagerAdapter adapter = viewPager.getAdapter();
if (!(adapter instanceof IconedTabPagerAdapter)) {
tabLayout.setupWithViewPager(viewPager);
return;
}
final IconedTabPagerAdapter iconedAdapter = ((IconedTabPagerAdapter) adapter);
for (int position = 0; position < adapter.getCount(); position++) {
final Drawable icon = iconedAdapter.getPageIcon(position);
final CharSequence title = adapter.getPageTitle(position);
tabLayout.addTab(tabLayout.newTab()
.setCustomView(tabCustomView)
.setIcon(icon)
.setText(title));
}
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
tabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(viewPager));
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.design.widget.TabLayout
android:id="@+id/tab"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabBackground="@color/tab_background"
app:tabIndicatorColor="@color/tab_indicator" />
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
tab_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:gravity="center"
android:orientation="vertical">
<android.support.v7.widget.AppCompatImageView
android:id="@android:id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<android.support.v7.widget.AppCompatTextView
android:id="@android:id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAllCaps="true"
android:textColor="@color/tab_title_color" />
</LinearLayout>
</RelativeLayout>
Result: