将值从活动传递到选项卡

时间:2015-09-12 22:30:08

标签: android android-fragments android-tabs

我正在开发一个新的Android项目。

第一项活动是使用滑块菜单和片段。在第一个片段上有一个列表视图(PrimaryFragmentDormir.java)。选择其中一行后,将启动一个新活动。最后一个活动使用三个选项卡,以显示有关所选行对象的不同信息。 listview是从远程JSON文件加载的。

这是PrimaryFragmentDormir.java上的onItemClick方法:

public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

        Hotel hotelActual = (Hotel) adapter.getItem(position);
        String msg = "Elegiste el hotel " + hotelActual.getNombre();
        Toast.makeText(getActivity(), msg, Toast.LENGTH_LONG).show();

        Intent intent = new Intent(getActivity(), Detalle_Hotel.class);

        intent.putExtra("id_hotel", hotelActual.getId_hotel());
        intent.putExtra("nombre_hotel", hotelActual.getId_hotel());
        intent.putExtra("descripcion_hotel", hotelActual.getId_hotel());
        intent.putExtra("latitud_hotel", hotelActual.getId_hotel());
        intent.putExtra("longitud_hotel", hotelActual.getId_hotel());
        intent.putExtra("direccion_hotel", hotelActual.getId_hotel());
        intent.putExtra("web_hotel", hotelActual.getId_hotel());
        intent.putExtra("tel_hotel", hotelActual.getId_hotel());
        intent.putExtra("tel_reservas", hotelActual.getId_hotel());
        intent.putExtra("foto_hotel", hotelActual.getId_hotel());
        intent.putExtra("calificacion_hotel", hotelActual.getId_hotel());
        intent.putExtra("num_estrellas", hotelActual.getId_hotel());
        intent.putExtra("zona_hotel", hotelActual.getId_hotel());
        intent.putExtra("facebook_hotel", hotelActual.getFacebook());
        intent.putExtra("twitter_hotel", hotelActual.getTwitter());


        startActivity(intent);




    }

显示Toast并显示活动Detalle_Hotel。

Detalle_Hotel有三个标签。 我需要的是从三个选项卡中的hotelActual获取值,以便单独使用它们。

这是Detalle_Hotel活动:

public class Detalle_Hotel extends AppCompatActivity {
    // Declaring Your View and Variables

    private String nombre_hotel, foto_hotel, descripcion_hotel,direccion_hotel,web_hotel,tel_hotel,tel_reservas,zona_hotel,facebook_hotel,twitter_hotel;
    private int num_estrellas_hotel, id_hotel;
    private double calificacion_hotel,latitud_hotel,longitud_hotel;

    Toolbar toolbar;
    ViewPager pager;
    ViewPagerAdapter adapter;
    SlidingTabLayout tabs;
    CharSequence Titles[]={"Info","Mapa","Opinión"};
    int Numboftabs =3;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_detalle__hotel);

        nombre_hotel = getIntent().getStringExtra("nombre_hotel");

        // Creating The Toolbar and setting it as the Toolbar for the activity

        toolbar = (Toolbar) findViewById(R.id.tool_bar);
        setSupportActionBar(toolbar);


        // Creating The ViewPagerAdapter and Passing Fragment Manager, Titles fot the Tabs and Number Of Tabs.
        adapter =  new ViewPagerAdapter(getSupportFragmentManager(),Titles,Numboftabs);

        // Assigning ViewPager View and setting the adapter
        pager = (ViewPager) findViewById(R.id.pager);
        pager.setAdapter(adapter);

        // Assiging the Sliding Tab Layout View
        tabs = (SlidingTabLayout) findViewById(R.id.tabs);
        tabs.setDistributeEvenly(true); // To make the Tabs Fixed set this true, This makes the tabs Space Evenly in Available width

        // Setting Custom Color for the Scroll bar indicator of the Tab View
        tabs.setCustomTabColorizer(new SlidingTabLayout.TabColorizer() {
            @Override
            public int getIndicatorColor(int position) {
                return getResources().getColor(R.color.rojomodesto);
            }
        });

        // Setting the ViewPager For the SlidingTabsLayout
        tabs.setViewPager(pager);



    }



}

这里我从nombre_hotel收到了值(作为其他值的测试),现在我该如何将它传递给标签?

这是tab1代码:

public class Tab1 extends Fragment {

   private  TextView hotel_nombre;
    private String nombre_hotel;
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View v =inflater.inflate(R.layout.tab_1,container,false);
        return v;
    }

    @Override
    public void onActivityCreated(Bundle state) {
        super.onActivityCreated(state);

    hotel_nombre = (TextView) getView().findViewById(R.id.nombre_hotel);

       hotel_nombre.setText(getActivity().nombre_hotel));
    }
}

hotel_nombre.setText(getActivity().nombre_hotel));在第二个nombre_hotel显示警告:“无法解析符号'nombre_hotel'。

欢迎任何帮助。

编辑:

ViewPageAdapter.java

public class ViewPagerAdapter extends FragmentStatePagerAdapter {

    CharSequence Titles[]; // This will Store the Titles of the Tabs which are Going to be passed when ViewPagerAdapter is created
    int NumbOfTabs; // Store the number of tabs, this will also be passed when the ViewPagerAdapter is created


    // Build a Constructor and assign the passed Values to appropriate values in the class
    public ViewPagerAdapter(FragmentManager fm, CharSequence mTitles[], int mNumbOfTabsumb) {
        super(fm);

        this.Titles = mTitles;
        this.NumbOfTabs = mNumbOfTabsumb;

    }

    //This method return the fragment for the every position in the View Pager

        @Override
        public Fragment getItem(int position) {

            if (position == 0) // if the position is 0 we are returning the First tab
            {
                Tab1 tab1 = new Tab1();
                return tab1;
            }
            if (position == 1) // if the position is 0 we are returning the First tab
            {
                Tab2 tab2 = new Tab2();
                return tab2;
            }

            if (position == 2) // if the position is 0 we are returning the First tab
            {
                Tab3 tab3 = new Tab3();
                return tab3;
            }

            return null;
        }

        // This method return the titles for the Tabs in the Tab Strip

    @Override
    public CharSequence getPageTitle(int position) {
        return Titles[position];
    }

    // This method return the Number of tabs for the tabs Strip

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

3 个答案:

答案 0 :(得分:5)

在适配器中,您需要立即正确初始化它(使用字符串作为参数)。

public class Tab1 extends Fragment {

    private static final String HOTEL = "hotel";

    private TextView hotel_nombre;
    private String nombre_hotel;

    public static Tab1 newInstance(String s) {
        Tab1 result = new Tab1();
        Bundle bundle = new Bundle();
        bundle.putString(HOTEL, s);
        result.setArguments(bundle);
        return result;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Bundle bundle = this.getArguments();
        nombre_hotel = bundle.getString(HOTEL);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View v =inflater.inflate(R.layout.tab_1,container,false);
        return v;
    }

    @Override
    public void onActivityCreated(Bundle state) {
        super.onActivityCreated(state);
        hotel_nombre = (TextView) getView().findViewById(R.id.nombre_hotel);
        hotel_nombre.setText(nombre_hotel);
    }

}

修改

将您的Detalle_Hotel活动,适配器更改为:

adapter = new ViewPagerAdapter(getSupportFragmentManager(),Titles,Numboftabs,nombre_hotel);

然后在适配器中:

public class ViewPagerAdapter extends FragmentStatePagerAdapter {

    CharSequence Titles[]; // This will Store the Titles of the Tabs which are Going to be passed when ViewPagerAdapter is created
    int NumbOfTabs; // Store the number of tabs, this will also be passed when the ViewPagerAdapter is created

    private String hotelNumbre;


    // Build a Constructor and assign the passed Values to appropriate values in the class
    public ViewPagerAdapter(FragmentManager fm, CharSequence mTitles[], int mNumbOfTabsumb, String hotelNum) {
        super(fm);

        this.Titles = mTitles;
        this.NumbOfTabs = mNumbOfTabsumb;
        this.hotelNumbre = hotelNum;

    }

    //This method return the fragment for the every position in the View Pager

        @Override
        public Fragment getItem(int position) {

            if (position == 0) // if the position is 0 we are returning the First tab
            {
                return Tab1.newInstance(hotelNumbre);
            }
            if (position == 1) // if the position is 0 we are returning the First tab
            {
                Tab2 tab2 = new Tab2();
                return tab2;
            }

            if (position == 2) // if the position is 0 we are returning the First tab
            {
                Tab3 tab3 = new Tab3();
                return tab3;
            }

            return null;
        }

        // This method return the titles for the Tabs in the Tab Strip

    @Override
    public CharSequence getPageTitle(int position) {
        return Titles[position];
    }

    // This method return the Number of tabs for the tabs Strip

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

答案 1 :(得分:1)

您需要将nombre_hotel字段设为公开而非私有,然后使用:

hotel_nombre.setText((Detalle_Hotel)getActivity().nombre_hotel));

答案 2 :(得分:0)

 val intent = Intent(activity, VoiceCommandServiceActivity::class.java)
        intent.putExtra(SELECT_SERVICES, mServiceName as Serializable)
        startActivity(activity, intent)

intent?.let {
            it.extras?.let { extras ->
                extras?.let { bundle ->
                    if (bundle.containsKey(SELECT_SERVICES)) {
                        val service = extras.getSerializable(SELECT_SERVICES) as MutableList<AppServiceModel>
                    }
                }
            }
        }