Android的会话数据实例化与使用碎片与标签的硬件资源的变化(旋转等) [英] Android session data instantiation related to hardware resource changes (rotation, etc) using fragments with tabs

查看:256
本文介绍了Android的会话数据实例化与使用碎片与标签的硬件资源的变化(旋转等)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我开发的数据实例化的理解,因为它适用于动作条使用标签和碎片。下面code会导致以下两个错误,

1)的方法,在类型FragmentTransaction替换(中间体,片段,字符串)是不适用的参数(中间体,Tab1Fragment,字符串)在

  getSupportFragmentManager()的BeginTransaction()代替(android.R.id.content,TAB1,Tab1Fragment_TAG)提交​​()。;
 

2)不能投从片段Tab1Fragment在

  Tab1Fragment TAB1 =(Tab1Fragment)getSupportFragmentManager()findFragmentByTag(Tab1Fragment_TAG)。
 

任何关于我如何可以使这项工作的建议?下面是code,因为我有现在。谢谢你。

 公共类MainActivity扩展FragmentActivity
{
@覆盖
保护无效的onCreate(包savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.activity_main);
            动作条动作条= getActionBar();
            actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
            ActionBar.Tab TAB1 = actionBar.newTab()的setText(TAB1)。
            片段tab1Fragment =新Tab1Fragment();
            tab1.setTabListener(新MyTabsListener(tab1Fragment));
                actionBar.addTab(TAB1);

    如果(savedInstanceState == NULL){
        Tab1Fragment TAB1 =新Tab1Fragment();
        Tab1.setArguments(getIntent()getExtras());
        。getSupportFragmentManager()的BeginTransaction()代替(android.R.id.content,TAB1,Tab1Fragment_TAG)提交​​()。
    }其他{
        Tab1Fragment TAB1 =(Tab1Fragment)getSupportFragmentManager()findFragmentByTag(Tab1Fragment_TAG)。
    }
  }
}
 

解决方案

下面是一个解决方案,以保留使用片段标签会话数据。我上传的例子项目Github上。这里的链接: https://github.com/portsample/FragmentTabRotation

MainActivity

 公共类MainActivity延伸活动{
私人最终静态字符串TAB_KEY_INDEX =TAB_KEY;
@覆盖
保护无效的onCreate(包savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.activity_main);
    //把动作条的标签模式
    动作条动作条= getActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    //设置标题为标签
    ActionBar.Tab TAB1 = actionBar.newTab()的setText(TAB1)。
    ActionBar.Tab TAB2 = actionBar.newTab()的setText(TAB2);
    ActionBar.Tab TAB3 = actionBar.newTab()的setText(TAB3)。
    //创建每个片的情况下,
    片段tab1Fragment =新Tab1Fragment();
    片段tab2Fragment =新Tab2Fragment();
    片段tab3Fragment =新Tab3Fragment();
    //附加这些片段实例到它们各自的标签
    tab1.setTabListener(新MyTabsListener(tab1Fragment));
    tab2.setTabListener(新MyTabsListener(tab2Fragment));
    tab3.setTabListener(新MyTabsListener(tab3Fragment));
    //添加每个标签的动作条
    actionBar.addTab(TAB1);
    actionBar.addTab(TAB2);
    actionBar.addTab(TAB3);
    如果(savedInstanceState == NULL){// ...什么都不做
    }否则,如果(savedInstanceState!= NULL){
    actionBar.setSelectedNavigationItem(savedInstanceState.getInt(TAB_KEY_INDEX,0));
    }
}
@覆盖
公共布尔onCreateOptionsMenu(功能菜单){
    MenuInflater充气= getMenuInflater();
    inflater.inflate(R.menu.main,菜单);
    返回true;
}
@覆盖
保护无效的onSaveInstanceState(包outState){
    super.onSaveInstanceState(outState);
    outState.putInt(TAB_KEY_INDEX,getActionBar()getSelectedNavigationIndex());

}
}
 

MyTabsListener

 公共类MyTabsListener实现ActionBar.TabListener {
公共片段片段;
//默认构造函数
公共MyTabsListener(片段片段){
    this.fragment =片段;
}
@覆盖
公共无效onTabReselected(TAB键,FragmentTransaction英尺){
    //放$ C $这里如果你想一些特别的东西,当用户重新选择一个选项卡发生Ç
}
//当选择新标签开始的片段
@覆盖
公共无效onTabSelected(TAB键,FragmentTransaction英尺){
    ft.replace(R.id.fragment_placeholder,片段);
}
//删除片段,当标签处于未选中状态
@覆盖
公共无效onTabUnselected(TAB键,FragmentTransaction英尺){
    ft.remove(片段);
}
}
 

Tab1Fragment

 公共类Tab1Fragment扩展片段{
字符串szSpecies;
公共静态INT iSpeciesPosition;
微调spinnerSpecies;
 @覆盖
    公共无效的onCreate(包savedDataEntryInstanceState){
        super.onCreate(savedDataEntryInstanceState);
        setRetainInstance(真正的);
    }
@覆盖
公共查看onCreateView(LayoutInflater充气,容器的ViewGroup,捆绑savedInstanceState){
    视图V = inflater.inflate(R.layout.tab1_fragment,集装箱,假);
    spinnerSpecies =(微调)v.findViewById(R.id.spinnerSpeciesxml);
    如果(savedInstanceState!= NULL){
        iSpeciesPosition = savedInstanceState.getInt(speciesPosition_key);
        populateTab1Fragment(五);
    }否则,如果(savedInstanceState == NULL){
        populateTab1Fragment(五);
    }
    返回伏;
}
@覆盖
公共无效的onSaveInstanceState(包outState){
    super.onSaveInstanceState(outState);
    iSpeciesPosition = spinnerSpecies.getSelectedItemPosition();
     outState.putInt(speciesPosition_key,iSpeciesPosition);
}
公共无效populateTab1Fragment(视图v){
    //下拉框
    的String [] szSpeciesArray = {红大马哈鱼,土拨鼠,橡胶靴,海豚,鳖,};
    微调spinnerSpecies =(微调)v.findViewById(R.id.spinnerSpeciesxml);
    ArrayAdapter<字符串> arrayAdapterSpecies =新的ArrayAdapter<字符串>(this.getActivity(),R.layout.spinnerstyle,szSpeciesArray);
    arrayAdapterSpecies.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line);
    spinnerSpecies.setAdapter(arrayAdapterSpecies);
    spinnerSpecies.setSelection(iSpeciesPosition);
}
}
 

I am developing an understanding of data instantiation as it applies to the ActionBar using tabs and fragments. The below code causes the following two errors,

1) "The method replace(int, Fragment, String) in the type FragmentTransaction is not applicable for the arguments (int, Tab1Fragment, String)" at

getSupportFragmentManager().beginTransaction().replace(android.R.id.content, Tab1,"Tab1Fragment_TAG").commit();

and,

2) "Cannot cast from Fragment to Tab1Fragment" at

Tab1Fragment Tab1 = (Tab1Fragment) getSupportFragmentManager().findFragmentByTag("Tab1Fragment_TAG");

Any suggestions regarding how I can make this work? Below is code as I have it now. Thanks.

public class MainActivity extends FragmentActivity 
{
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
            ActionBar actionBar = getActionBar();
            actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);            
            ActionBar.Tab tab1 = actionBar.newTab().setText("Tab1");
            Fragment tab1Fragment = new Tab1Fragment();
            tab1.setTabListener(new MyTabsListener(tab1Fragment));
                actionBar.addTab(tab1); 

    if(savedInstanceState == null) {
        Tab1Fragment Tab1 = new Tab1Fragment();
        Tab1.setArguments(getIntent().getExtras());
        getSupportFragmentManager().beginTransaction().replace(android.R.id.content, Tab1,"Tab1Fragment_TAG").commit();
    }else{
        Tab1Fragment Tab1 = (Tab1Fragment) getSupportFragmentManager().findFragmentByTag("Tab1Fragment_TAG");
    }           
  }
}

解决方案

Below is a solution to retaining session data using fragment-tabs. I've uploaded the example project to Github. Here's the link: https://github.com/portsample/FragmentTabRotation

MainActivity

public class MainActivity extends Activity{
private final static String TAB_KEY_INDEX = "TAB_KEY";
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //put Actionbar in tab mode     
    ActionBar actionBar = getActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);            
    //set titles for tabs
    ActionBar.Tab tab1 = actionBar.newTab().setText("Tab1");
    ActionBar.Tab tab2 = actionBar.newTab().setText("Tab2");
    ActionBar.Tab tab3 = actionBar.newTab().setText("Tab3");
    //create instances of each of the fragments
    Fragment tab1Fragment = new Tab1Fragment();
    Fragment tab2Fragment = new Tab2Fragment();
    Fragment tab3Fragment = new Tab3Fragment();
    //attach those fragment instances to their respective tabs
    tab1.setTabListener(new MyTabsListener(tab1Fragment));
    tab2.setTabListener(new MyTabsListener(tab2Fragment));
    tab3.setTabListener(new MyTabsListener(tab3Fragment));
    //add each tab to the ActionBar
    actionBar.addTab(tab1);
    actionBar.addTab(tab2);
    actionBar.addTab(tab3);
    if (savedInstanceState == null){//...do nothing                     
    }else if (savedInstanceState != null){
    actionBar.setSelectedNavigationItem(savedInstanceState.getInt(TAB_KEY_INDEX,0));
    }
}
@Override
public boolean onCreateOptionsMenu(Menu menu){
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main, menu);
    return true;
}
@Override
protected void onSaveInstanceState(Bundle outState){
    super.onSaveInstanceState(outState);
    outState.putInt(TAB_KEY_INDEX, getActionBar().getSelectedNavigationIndex());

}   
}

MyTabsListener

public class MyTabsListener implements ActionBar.TabListener{
public Fragment fragment;   
//default constructor
public MyTabsListener(Fragment fragment){
    this.fragment = fragment;
}   
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft){
    //put code here if you want something special to happen when a user reselects a tab
}
//starts fragment when new tab is selected
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft){
    ft.replace(R.id.fragment_placeholder, fragment);
}
//remove fragment when tab is unselected
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft){
    ft.remove(fragment);
}
}

Tab1Fragment

public class Tab1Fragment extends Fragment{
String szSpecies;
public static int iSpeciesPosition;
Spinner spinnerSpecies; 
 @Override
    public void onCreate(Bundle savedDataEntryInstanceState) {
        super.onCreate(savedDataEntryInstanceState);
        setRetainInstance(true);
    }
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
    View v = inflater.inflate(R.layout.tab1_fragment, container, false);
    spinnerSpecies = (Spinner) v.findViewById(R.id.spinnerSpeciesxml);
    if(savedInstanceState != null){
        iSpeciesPosition = savedInstanceState.getInt("speciesPosition_key");
        populateTab1Fragment(v);
    }else if(savedInstanceState == null){
        populateTab1Fragment(v);
    }   
    return v;
}
@Override
public void onSaveInstanceState(Bundle outState){
    super.onSaveInstanceState(outState);
    iSpeciesPosition = spinnerSpecies.getSelectedItemPosition();
     outState.putInt("speciesPosition_key", iSpeciesPosition);
}
public void populateTab1Fragment(View v){   
    //dropdown box
    String [] szSpeciesArray = {"Sockeye","Marmot","Gumboot","Porpoise","Terrapin",};
    Spinner spinnerSpecies = (Spinner) v.findViewById(R.id.spinnerSpeciesxml);
    ArrayAdapter<String> arrayAdapterSpecies = new ArrayAdapter<String>(this.getActivity(), R.layout.spinnerstyle, szSpeciesArray);
    arrayAdapterSpecies.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line);
    spinnerSpecies.setAdapter(arrayAdapterSpecies);
    spinnerSpecies.setSelection(iSpeciesPosition);
}
}

这篇关于Android的会话数据实例化与使用碎片与标签的硬件资源的变化(旋转等)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆