5

と互換性がありませんうまくを行います。アンドロイド - 断片サポートライブラリからは、サポートライブラリを使用している間、私は奇妙な問題が発生した4.3プラットフォーム


私はちょうどAPI Demoが何をしたかのように、2.3.3プラットフォーム上で切り替え断片とダイナミックナビゲーションタブを作りたいです。

enter image description here


すべてが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; 

次の画像は、私のデモは enter image description here

を行って、ここに私のコードです方法を示しています


しかし、私はregular api(default platform api)にすべてsupport apiを変更すると、すべてが4.3プラットフォーム上で罰金行く(しかし、この1つは2.3.3プラットフォームと互換性がありません)。

enter image description here

ここにコード(アクションバーおよびフラグメント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; 
     } 
    } 
} 

Iは、(値-V14/classes.xml)を使用して、互換性のあるバージョンを作ることができ、次のコード

try { 
    Class<?> clazz = Class.forName(getString(R.string.class_navigationTabsAndFragmentsActivity)); 
    startActivity(clazz); 
} catch (ClassNotFoundException ex) { 
    showTextByToast(ex.getMessage()); 
} 

support libraryバージョンで何が起こっているのか知りたいのですが、誰でもこの問題を理解するのに手伝ってもらえますか?

+1

ます。http:// stackoverflowの。com/questions/19642295/actionbar-tab-contents-overlapping/19644639#19644639 – Luksprog

+0

ありがとう@Luksprog;どのように奇妙な、アンドロイドのチームは、このpromblemを実現していない、または彼らはちょうど他の目的でそれを変更しましたか?それでもサポートライブラリを使用する必要があります。ちょうど時間好きになった好きなバグを残しました。 –

+1

誰かがバグレポートを投稿したかどうかわかりません。私はまだライブラリを使用し、それを解決する可能性のある互換性パッケージ(より頻繁に来る)へのアップデートのために時計の上にいるでしょう。 – Luksprog

答えて

2

は、Googleがリリースネクサス5と新しいサポートライブラリ(V19)、このバグに固定し、このバージョン enter image description here

関連する問題