Страница 1 из 1

Табы и фрагменты

Добавлено: 15 мар 2016, 12:42
Arman
Здравствуйте я новичок в разработке андроид, создано два фрагмента класса и layout к ним но почему то в PagerAdapter android studio подчеркивает как ошибку вот мой код нашел в инете, подскажите что не так
Mainactivity

Код: Выделить всё

package loc.mab.tabsproject;

import android.app.Fragment;
import android.content.Context;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.design.widget.TabLayout;
import android.support.v4.app.FragmentManager;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        ViewPager pager= (ViewPager) findViewById(R.id.view_pager);
        TabLayout tabLayout= (TabLayout) findViewById(R.id.tab_layout);



        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });


        // Fragment manager to add fragment in viewpager we will pass object of Fragment manager to adpater class.
        FragmentManager manager=getSupportFragmentManager();

        //object of PagerAdapter passing fragment manager object as a parameter of constructor of PagerAdapter class.
        PagerAdapter adapter=new PagerAdapter(manager);

        //set Adapter to view pager
        pager.setAdapter(adapter);

        //set tablayout with viewpager
        tabLayout.setupWithViewPager(pager);

        // adding functionality to tab and viewpager to manage each other when a page is changed or when a tab is selected
        pager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));

        //Setting tabs from adpater
        tabLayout.setTabsFromPagerAdapter(adapter);
    }

    @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_main, 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);
    }
}

PagerAdapter

Код: Выделить всё

package loc.mab.tabsproject;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.text.Layout;

/**
 * Created by androidwarriors on 10/16/2015.
 */
public class PagerAdapter extends FragmentStatePagerAdapter
{

    public PagerAdapter(FragmentManager fm)
    {
        super(fm);
    }

    @Override
    public Fragment getItem(int position)
    {
        Fragment frag=null;
        switch (position)
        {
            case 0:
                frag= new GameFragment(); // вот эти строки подчеркивает
                break;
            case 1:
                frag=new MovieFragment(); // вот эти строки подчеркивает
                break;

        }
        return frag;
    }

    @Override
    public int getCount()
    {
        return 2;
    }

    @Override
    public CharSequence getPageTitle(int position)
    {
        String title=" ";
        switch (position)
        {
            case 0:
                title="Game";
                break;
            case 1:
                title="Movie";
                break;
        }

        return title;
    }
}
[img]
http://hostingkartinok.com/show-image.p ... 2f0b890510
[/img]

Re: Табы и фрагменты

Добавлено: 15 мар 2016, 13:01
klblk
Вы можете навести на строку, которая подчеркивается и там напишется что у вас не так.
Думаю тут проблема в импортах, вероятно у вас GameFragment и MovieFragment наследуются от android.app.Fragment, а в PagerAdapter используются android.support.v4.app.Fragment.

Re: Табы и фрагменты

Добавлено: 15 мар 2016, 13:14
Arman
klblk писал(а):Вы можете навести на строку, которая подчеркивается и там напишется что у вас не так.
Думаю тут проблема в импортах, вероятно у вас GameFragment и MovieFragment наследуются от android.app.Fragment, а в PagerAdapter используются android.support.v4.app.Fragment.
Я импортировал import android.app.Fragment;
теперь подчеркивает слово Fragment строка 8

Код: Выделить всё

//import android.support.v4.app.Fragment;
import android.app.Fragment;

import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.FragmentStatePagerAdapter;

 public Fragment getItem(int position)


Re: Табы и фрагменты

Добавлено: 15 мар 2016, 13:29
klblk
Проще будет в самих фрагментах поменять импорты. Но если так то и FragmentManager менять придется и его получение в MainActivity и может еще что-то.

Re: Табы и фрагменты

Добавлено: 15 мар 2016, 13:39
Arman
klblk писал(а):Проще будет в самих фрагментах поменять импорты. Но если так то и FragmentManager менять придется и его получение в MainActivity и может еще что-то.
Можете написать какие

Re: Табы и фрагменты

Добавлено: 16 мар 2016, 05:07
klblk
в GameFragment и MovieFragment поменяйте импорты фрагмента на android.support.v4.app.Fragment

Re: Табы и фрагменты

Добавлено: 16 мар 2016, 18:27
Arman
Подскажите вот код фрагмента в нем хочу добавить табы, но android studio
подчеркивает строку ( точнее getSupportFragmentManager()) Cannot resove method, хотя если тоже самое прописываю в activity то все нормально, подскажите что добавить чтобы табы в фрагменте были перерыл кучу страниц в фрагменте если есть то пишут тот же код, а у меня подчеркивает он getSupportFragmentManager()
final PagerAdapter adapter = new PagerAdapter(getSupportFragmentManager(), tabLayout.getTabCount());

Код: Выделить всё

package loc.mab.test;

import android.app.Activity;
import android.content.Context;
import android.net.Uri;
import android.os.Bundle;
import android.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.design.widget.TabLayout;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewParentCompatICS;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TabHost;
import android.widget.TabHost.OnTabChangeListener;
import android.widget.TableLayout;
import android.widget.TextView;
import android.widget.Toast;


public class add_organization extends Fragment {


    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState)
    {
        View view=inflater.inflate(R.layout.frg_add_organization, null);
        TabLayout tabLayout = (TabLayout) view.findViewById(R.id.tab_layout);
        tabLayout.addTab(tabLayout.newTab().setText("Tab 1"));
        tabLayout.addTab(tabLayout.newTab().setText("Tab 2"));
        tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);

        final ViewPager viewPager = (ViewPager) view.findViewById(R.id.pager);
        final PagerAdapter adapter = new PagerAdapter(getSupportFragmentManager(), tabLayout.getTabCount());
        viewPager.setAdapter(adapter);
        viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
        tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                viewPager.setCurrentItem(tab.getPosition());
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {

            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        });

        // Inflate the layout for this fragment
        return view;
    }




}



Layout фрагмента

Код: Выделить всё

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="loc.mab.test.AddOrgFragment">

        <android.support.design.widget.TabLayout
            android:id="@+id/tab_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:tabMaxWidth="0dp"
            app:tabGravity="fill"
            app:tabIndicatorColor="#fff"
            android:background="?attr/colorPrimary"
            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/>

        <android.support.v4.view.ViewPager
            android:id="@+id/pager"
            android:layout_width="match_parent"
            android:layout_height="fill_parent"
            android:layout_below="@id/tab_layout"/>

    </RelativeLayout>


PagerAdapter

Код: Выделить всё

package loc.mab.test;

        import android.support.v4.app.Fragment;
        import android.support.v4.app.FragmentManager;
        import android.support.v4.app.FragmentStatePagerAdapter;

public class PagerAdapter extends FragmentStatePagerAdapter {
    int mNumOfTabs;

    public PagerAdapter(FragmentManager fm, int NumOfTabs) {
        super(fm);
        this.mNumOfTabs = NumOfTabs;
    }




    @Override
    public Fragment getItem(int position)
    {
        Fragment tab=null;

        switch (position)
        {
            case 0:
                tab = new FreeFragment();
                break;
            case 1:
                tab = new BuyFragment();
                break;
        }

        return tab;
    }

    @Override
    public int getCount() {
        return mNumOfTabs;
    }
}

Re: Табы и фрагменты

Добавлено: 17 мар 2016, 05:12
klblk
Опять у с импортами не то. Фрагмент наследуйте фрагмент от android.support.v4.app.Fragment, а не от android.app.Fragment. Вот фрагменте используйте getFragmentManager().

Re: Табы и фрагменты

Добавлено: 17 мар 2016, 07:52
Arman
Я добавил в фрагмент import android.support.v4.app.Fragment; да он перестал подчеркивать getFragmentManager(), но при запуске приложения выходит ошибка в MainActivity функция public boolean onNavigationItemSelected(MenuItem item) при выборе пункта drawer menu я подгружаю этот фрагмент где табы если в фрагменте вернуть
import android.app.Fragment то в Mainactivity нет ошибки, но ошибка getFragmentManager(), если поставить как вы говорите в фрагменте import android.support.v4.app.Fragment то в фрагменте android studio не подчеркивает ничего но при запуске в MainActivity подчеркивает строку fTrans.replace(R.id.frgmCont, add_organization);

Код: Выделить всё

package loc.mab.test;

import android.support.v4.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.design.widget.TabLayout;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {

   FragmentTransaction fTrans;
    add_organization add_organization;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.setDrawerListener(toggle);
        toggle.syncState();

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);

       

    }

    @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, 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);
    }

    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.

        int id = item.getItemId();
        fTrans = getFragmentManager().beginTransaction();
        switch (id)
        {
            case R.id.nav_gallery:
                add_organization=new add_organization();
                fTrans.replace(R.id.frgmCont, add_organization);
                break;
        }

        fTrans.addToBackStack(null);
        fTrans.commit();

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }
}
Изображение

Разобрался нужно было в MainActivity поменять import android.app.FragmentTransaction
на import android.support.v4.app.FragmentTransaction;

Правда при переходе табы заливают фон своим цветом

Код: Выделить всё

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="loc.mab.test.AddOrgFragment">

    <android.support.design.widget.AppBarLayout
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:theme="@style/AppTheme.AppBarOverlay"
        >


        <android.support.design.widget.TabLayout
            android:id="@+id/tab_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:tabMaxWidth="0dp"
            app:tabGravity="fill"
            app:tabIndicatorColor="#fff"
            />

         <android.support.v4.view.ViewPager
           android:id="@+id/pager"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:layout_below="@id/tab_layout"/>

    </android.support.design.widget.AppBarLayout>

</LinearLayout>
Изображение

Re: Табы и фрагменты

Добавлено: 17 мар 2016, 09:25
klblk
ViewPager вытащите из AppBarLayout:
[syntax=xml]<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="loc.mab.test.AddOrgFragment">

<android.support.design.widget.AppBarLayout
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:theme="@style/AppTheme.AppBarOverlay"
>


<android.support.design.widget.TabLayout
android:id="@+id/tab_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabMaxWidth="0dp"
app:tabGravity="fill"
app:tabIndicatorColor="#fff"
/>

</android.support.design.widget.AppBarLayout>

<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

</LinearLayout> [/syntax]

Re: Табы и фрагменты

Добавлено: 17 мар 2016, 10:04
Arman
Проблема решена добавил фрагментам background