5
我在使用支持庫時遇到了一個奇怪的問題。Android - 來自支持庫的片段與4.3平臺不兼容
我想打一個動態的導航選項卡與片段2.3.3平臺上切換,就像什麼API Demo
一樣。
一切順利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的支持庫
import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; import android.support.v7.app.ActionBar; import android.support.v7.app.ActionBar.Tab; import android.support.v7.app.ActionBar.TabListener; import android.support.v7.app.ActionBarActivity;
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;
}
}
}
但是,當我改變所有的support api
到regular api(default platform api)
,一切都在4.3平臺罰款(但這個不兼容2.3.3平臺);
這裏的代碼(除了動作條和片段API沒什麼區別)
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;
//使用來自默認的平臺(僅在V11和更高版本)
的API
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;
@SuppressLint( 「NewApi」)
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;
}
}
}
我可以使用(值-V14/classes.xml)和下面的代碼
try {
Class<?> clazz = Class.forName(getString(R.string.class_navigationTabsAndFragmentsActivity));
startActivity(clazz);
} catch (ClassNotFoundException ex) {
showTextByToast(ex.getMessage());
}
但我還是做一個兼容的版本想知道support library
版本中發生了什麼,任何人都可以幫我弄清楚這個問題嗎?
的http://計算器。com/questions/19642295/actionbar-tab-contents-overlapping/19644639#19644639 – Luksprog
非常感謝@Luksprog;多麼奇怪,沒有android團隊意識到這個問題,或者他們只是改變了這個目的?我還應該使用支持庫嗎?留下一個像這樣的錯誤只是留下了一段時間的繁榮; –
我不知道是否有人發佈了一個錯誤報告。我仍然會使用這個庫,並且在手錶上更新兼容性軟件包(更常見),這可以解決這個問題。 – Luksprog