像 TabHost.onTabChanged() 这样的东西
Something like TabHost.onTabChanged()
我正在制作一个选项卡式应用程序,需要一种方法来在我更改选项卡时执行操作。问题是我能找到的只是关于 TabHost 的,它依赖于已弃用的 TabActivity class。即使它没有被弃用,预生成的选项卡式 activity 代码甚至没有使用它,所以我必须从头开始构建我的主要 activity class。所以我想知道是否有另一种方法来获得该功能
代码的粗略框架
public class MainActivity 扩展 AppCompatActivity 实现 TabHost.OnTabChangeListener{
public class SectionsPagerAdapter 扩展了 FragmentPagerAdapter {
}
}
假设您使用的是 Android Studio 1.5.1。
当我使用新建项目向导创建项目并接受默认设置时,除了选择 "Tabbed Activity" 作为模板外,在向导的 activity-configuration 页面上,有一个"Navigation Style" 的下拉菜单。那里有三个选项:"Swipe Views"、"Action Bar Tabs" 和 "Action Bar Spinner"。
假设您选择了 "Action Bar Tabs"。
结果 activity 没有 implements TabHost.OnTabChangeListener
,而且我不知道他们的任何模板都有。相反,你会得到这个:
import android.support.design.widget.TabLayout;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
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.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
/**
* 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_main);
Toolbar toolbar=(Toolbar)findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
// 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.container);
mViewPager.setAdapter(mSectionsPagerAdapter);
TabLayout tabLayout=(TabLayout)findViewById(R.id.tabs);
tabLayout.setupWithViewPager(mViewPager);
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();
}
});
}
@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);
}
/**
* A placeholder fragment containing a simple view.
*/
public static class PlaceholderFragment extends Fragment {
/**
* The fragment argument representing the section number for
* this
* fragment.
*/
private static final String ARG_SECTION_NUMBER=
"section_number";
public PlaceholderFragment() {
}
/**
* Returns a new instance of this fragment for the given
* section
* number.
*/
public static PlaceholderFragment newInstance(
int sectionNumber) {
PlaceholderFragment fragment=new PlaceholderFragment();
Bundle args=new Bundle();
args.putInt(ARG_SECTION_NUMBER, sectionNumber);
fragment.setArguments(args);
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState) {
View rootView=
inflater.inflate(R.layout.fragment_main, container,
false);
TextView textView=
(TextView)rootView.findViewById(R.id.section_label);
textView.setText(getString(R.string.section_format,
getArguments().getInt(ARG_SECTION_NUMBER)));
return rootView;
}
}
/**
* A {@link FragmentPagerAdapter} that returns a fragment
* corresponding to
* one of the sections/tabs/pages.
*/
public class SectionsPagerAdapter
extends FragmentPagerAdapter {
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
// getItem is called to instantiate the fragment for the given page.
// Return a PlaceholderFragment (defined as a static inner class below).
return PlaceholderFragment.newInstance(position+1);
}
@Override
public int getCount() {
// Show 3 total pages.
return 3;
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return "SECTION 1";
case 1:
return "SECTION 2";
case 2:
return "SECTION 3";
}
return null;
}
}
}
如果这是您的起点,那么对 "explain exactly what you are using right now" 的正确回应应该是“AppCompatActivity
、ViewPager
和 TabLayout
”。
让我们假装这就是你所拥有的,或多或少。
在那种情况下,call addOnPageChangeListener()
on the ViewPager
,传入一个 OnPageChangeListener
实现。这将在用户切换选项卡时调用,无论是通过 TabLayout
还是通过 ViewPager
本身的滑动手势。
现在,鉴于您对问题的有限解释,我不得不做出一些猜测,这完全有可能不是您所拥有的。
我正在制作一个选项卡式应用程序,需要一种方法来在我更改选项卡时执行操作。问题是我能找到的只是关于 TabHost 的,它依赖于已弃用的 TabActivity class。即使它没有被弃用,预生成的选项卡式 activity 代码甚至没有使用它,所以我必须从头开始构建我的主要 activity class。所以我想知道是否有另一种方法来获得该功能
代码的粗略框架
public class MainActivity 扩展 AppCompatActivity 实现 TabHost.OnTabChangeListener{
public class SectionsPagerAdapter 扩展了 FragmentPagerAdapter {
}
}
假设您使用的是 Android Studio 1.5.1。
当我使用新建项目向导创建项目并接受默认设置时,除了选择 "Tabbed Activity" 作为模板外,在向导的 activity-configuration 页面上,有一个"Navigation Style" 的下拉菜单。那里有三个选项:"Swipe Views"、"Action Bar Tabs" 和 "Action Bar Spinner"。
假设您选择了 "Action Bar Tabs"。
结果 activity 没有 implements TabHost.OnTabChangeListener
,而且我不知道他们的任何模板都有。相反,你会得到这个:
import android.support.design.widget.TabLayout;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
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.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
/**
* 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_main);
Toolbar toolbar=(Toolbar)findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
// 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.container);
mViewPager.setAdapter(mSectionsPagerAdapter);
TabLayout tabLayout=(TabLayout)findViewById(R.id.tabs);
tabLayout.setupWithViewPager(mViewPager);
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();
}
});
}
@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);
}
/**
* A placeholder fragment containing a simple view.
*/
public static class PlaceholderFragment extends Fragment {
/**
* The fragment argument representing the section number for
* this
* fragment.
*/
private static final String ARG_SECTION_NUMBER=
"section_number";
public PlaceholderFragment() {
}
/**
* Returns a new instance of this fragment for the given
* section
* number.
*/
public static PlaceholderFragment newInstance(
int sectionNumber) {
PlaceholderFragment fragment=new PlaceholderFragment();
Bundle args=new Bundle();
args.putInt(ARG_SECTION_NUMBER, sectionNumber);
fragment.setArguments(args);
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState) {
View rootView=
inflater.inflate(R.layout.fragment_main, container,
false);
TextView textView=
(TextView)rootView.findViewById(R.id.section_label);
textView.setText(getString(R.string.section_format,
getArguments().getInt(ARG_SECTION_NUMBER)));
return rootView;
}
}
/**
* A {@link FragmentPagerAdapter} that returns a fragment
* corresponding to
* one of the sections/tabs/pages.
*/
public class SectionsPagerAdapter
extends FragmentPagerAdapter {
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
// getItem is called to instantiate the fragment for the given page.
// Return a PlaceholderFragment (defined as a static inner class below).
return PlaceholderFragment.newInstance(position+1);
}
@Override
public int getCount() {
// Show 3 total pages.
return 3;
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return "SECTION 1";
case 1:
return "SECTION 2";
case 2:
return "SECTION 3";
}
return null;
}
}
}
如果这是您的起点,那么对 "explain exactly what you are using right now" 的正确回应应该是“AppCompatActivity
、ViewPager
和 TabLayout
”。
让我们假装这就是你所拥有的,或多或少。
在那种情况下,call addOnPageChangeListener()
on the ViewPager
,传入一个 OnPageChangeListener
实现。这将在用户切换选项卡时调用,无论是通过 TabLayout
还是通过 ViewPager
本身的滑动手势。
现在,鉴于您对问题的有限解释,我不得不做出一些猜测,这完全有可能不是您所拥有的。