Android-来自支持库的片段不';与4.3平台兼容良好
我在使用支持库时遇到了一个奇怪的问题Android-来自支持库的片段不';与4.3平台兼容良好,android,android-fragments,android-actionbar,android-support-library,Android,Android Fragments,Android Actionbar,Android Support Library,我在使用支持库时遇到了一个奇怪的问题 我想制作一个动态导航标签,在2.3.3平台上切换片段,就像API演示所做的那样 在2.3.3平台上一切都很顺利,但是当我在4.3平台上查看相同的活动时,我发现有些事情很奇怪 SupportFragmentManagement无法分离片段,似乎选项卡选择回调没有正确执行 下面的图片显示了我的演示如何进行 这是我的代码: package net.zengweizhi.android.gettingstarted.lesson05.test; import
我想制作一个动态导航标签,在2.3.3平台上切换片段,就像
API演示所做的那样
在2.3.3平台上一切都很顺利,但是当我在4.3平台上查看相同的活动时,我发现有些事情很奇怪
SupportFragmentManagement
无法分离片段,似乎选项卡选择回调没有正确执行
下面的图片显示了我的演示如何进行
这是我的代码:
package net.zengweizhi.android.gettingstarted.lesson05.test;
import net.zengweizhi.android.gettingstarted.R;
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;
//使用支持库中的api
但是,当我将所有支持api
更改为常规api(默认平台api)
时,4.3平台上的一切都很好(但这一个与2.3.3平台不兼容)
下面是代码(除了ActionBar和FragmentAPI之外没有什么区别)
//使用默认平台的api(仅在v11及更高版本中)
@suppressint(“NewApi”)
我可以使用(values-v14/classes.xml)和下面的代码制作一个兼容的版本
try {
Class<?> clazz = Class.forName(getString(R.string.class_navigationTabsAndFragmentsActivity));
startActivity(clazz);
} catch (ClassNotFoundException ex) {
showTextByToast(ex.getMessage());
}
试试看{
Class clazz=Class.forName(getString(R.string.Class_NavigationTab和FragmentsActivity));
星触觉(clazz);
}捕获(ClassNotFoundException ex){
showTextByToast(例如getMessage());
}
但是我仍然想知道支持库版本中发生了什么,有人能帮我解决这个问题吗?谷歌发布了Nexus 5和一个新的支持库(v19),这个版本修复了这个错误
非常感谢@Luksprog;奇怪的是,安卓团队没有意识到这个问题,或者他们只是出于其他目的改变了这个问题?我是否仍应使用支持库;留下这样一只虫子就像留下了一个时间繁荣;我不知道是否有人发布了错误报告。我仍然会使用这个库,并随时关注兼容性包的更新(更新的频率更高),这可以解决这个问题。@Luksprog你是对的,你的解决方案很好;但是我仍然想在SupportV7项目中解决这个问题,我找到了的源代码,我将查看代码,并在稍后给出关于这个主题的解决方案:-)
public class NavigationTabsWithFragmentsV9 extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_navigation_tabs, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.actionButton_addTab:
addTab();
break;
case R.id.actionButton_removeTab:
removeTab();
break;
default:
break;
}
return super.onOptionsItemSelected(item);
}
private int mTabSeq = 0;
private void addTab(){
getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
mTabSeq++;
Tab tab = getSupportActionBar().newTab();
tab.setText("TAB " + mTabSeq);
tab.setTabListener(new MyTabListener(this));
getSupportActionBar().addTab(tab);
}
private void removeTab(){
Tab tab = getSupportActionBar().getSelectedTab();
getSupportActionBar().removeTab(tab);
Fragment fragment = getSupportFragmentManager().findFragmentByTag(tab.getText().toString());
getSupportFragmentManager().beginTransaction().remove(fragment).commit();
if( getSupportActionBar().getTabCount() == 0 ){
getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
}
}
private static final class MyTabListener implements TabListener {
private NavigationTabsWithFragmentsV9 mActivity;
public MyTabListener(NavigationTabsWithFragmentsV9 activity /*,Fragment fragment*/){
mActivity = activity;
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
// Do nothing
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
Object obj = tab.getTag();
if( null == obj ){
Bundle args = new Bundle();
args.putString(SimpleFragment.EXTRA_OUTPUT_MESSAGE, tab.getText().toString());
Fragment fragment = Fragment.instantiate(mActivity, SimpleFragment.class.getName(), args);
ft.add(android.R.id.content, fragment, tab.getText().toString());
tab.setTag(obj = fragment);
}
ft.attach((Fragment)obj);
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
if( null != mActivity.getSupportFragmentManager().findFragmentByTag(tab.getText().toString()) ){
ft.detach((Fragment)tab.getTag());
}
}
}
public static final class SimpleFragment extends Fragment {
public static final String EXTRA_OUTPUT_MESSAGE = "output_message";
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View fragmentView = inflater.inflate(R.layout.fragment_simple, container, false);
String outputMesasge = null;
if( null != getArguments() ){
outputMesasge = getArguments().getString(EXTRA_OUTPUT_MESSAGE);
}
if( null == outputMesasge || 0 == outputMesasge.trim().length() ){
outputMesasge = getString(R.string.demo_text);
}
TextView textView = (TextView) fragmentView.findViewById(R.id.textView_simpleFragmentOutput);
textView.setText(outputMesasge);
return fragmentView;
}
}
}
package net.zengweizhi.android.gettingstarted.lesson05.test;
import net.zengweizhi.android.gettingstarted.R;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.annotation.SuppressLint;
import android.app.ActionBar;
import android.app.ActionBar.Tab;
import android.app.ActionBar.TabListener;
import android.app.Fragment;
import android.app.FragmentTransaction;
public class NavigationTabsWithFragmentsV14 extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_navigation_tabs, menu);
return super.onCreateOptionsMenu(menu);
}
private int mTabSeq = 0;
private void addTab(){
getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
mTabSeq++;
Tab tab = getActionBar().newTab();
tab.setText("TAB " + mTabSeq);
tab.setTabListener(new MyTabListener(this));
getActionBar().addTab(tab);
}
private void removeTab(){
Tab tab = getActionBar().getSelectedTab();
getActionBar().removeTab(tab);
Fragment fragment = getFragmentManager().findFragmentByTag(tab.getText().toString());
getFragmentManager().beginTransaction().remove(fragment).commit();
if( getActionBar().getTabCount() == 0 ){
getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.actionButton_addTab:
addTab();
break;
case R.id.actionButton_removeTab:
removeTab();
break;
default:
break;
}
return super.onOptionsItemSelected(item);
}
private static final class MyTabListener implements TabListener {
private NavigationTabsWithFragmentsV14 mActivity;
public MyTabListener(NavigationTabsWithFragmentsV14 activity /*,Fragment fragment*/){
mActivity = activity;
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
// Do nothing
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
Object obj = tab.getTag();
if( null == obj ){ // initialize fragment to tab
Bundle args = new Bundle();
args.putString(SimpleFragment.EXTRA_OUTPUT_MESSAGE, tab.getText().toString());
Fragment fragment = Fragment.instantiate(mActivity, SimpleFragment.class.getName(), args);
ft.add(android.R.id.content, fragment, tab.getText().toString());
tab.setTag(obj = fragment);
}
ft.attach((Fragment)obj);
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
if( null != mActivity.getFragmentManager().findFragmentByTag(tab.getText().toString()) ){
ft.detach((Fragment)tab.getTag());
}
}
}
public static final class SimpleFragment extends Fragment {
public static final String EXTRA_OUTPUT_MESSAGE = "output_message";
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View fragmentView = inflater.inflate(R.layout.fragment_simple, container, false);
String outputMesasge = null;
if( null != getArguments() ){
outputMesasge = getArguments().getString(EXTRA_OUTPUT_MESSAGE);
}
if( null == outputMesasge || 0 == outputMesasge.trim().length() ){
outputMesasge = getString(R.string.demo_text);
}
TextView textView = (TextView) fragmentView.findViewById(R.id.textView_simpleFragmentOutput);
textView.setText(outputMesasge);
return fragmentView;
}
}
}
try {
Class<?> clazz = Class.forName(getString(R.string.class_navigationTabsAndFragmentsActivity));
startActivity(clazz);
} catch (ClassNotFoundException ex) {
showTextByToast(ex.getMessage());
}