2012-03-06 21 views
8

新しいタブシステム(ActionBar.addTab())を使用するアプリケーションを開発していますが、3つのタブがあります。 特定のプロセス中に2つのアイテムをロック(無効にしたい)したい(削除しないで、クリックを受け入れずに「セレクタ」を変更しない)。Android ActionBar.Tabを有効/無効にする

コンテンツを変更することはできませんでしたTabListenerとフラグメントを変更しない、など)が、セレクタの変更。

のみ無効にする/再び削除し、追加する?事前に

感謝を持っていなくて?タブを有効にとにかくあります! BR、 ダニーロ

答えて

2

申し訳ありませんが、アクションバーのタブで「無効」または「無効」に設定します。あなたが注意しているように、それらを削除して再追加することができます。これはAFAIKに最も近いものです。

+3

はい、わかります!ありがとう。私は変更するタブを変更「することができます」と、TabListenerのチェックを追加することによって、奇妙な振る舞いを追加し、そうでない場合は、私はあなたの問題を回避するには、その単純ではありません@DaniloBertelli最新のタブ= P – DaniloBertelli

+2

を再選択するために、マネージャーをしました。選択したタブを適切に更新するために、「最新のタブを再選択してください」というビューは、ビューの1つのポストを介してキューに入れられたRunnableに存在する必要があります。あなたが本当に理由を知りたいのであれば、そのメソッドの[child.setSelected](http://is.gd/OCa2tF)の呼び出しの後に、tab.select呼び出しが必要になるので、ScrollingTabContainerView#TabClickListener.onClickを参照してください。 – Daniel

+0

@ダニエルこの入力ボックスには、感謝の意を表すのに十分な文字がありません。基本的に私はすでに 'Activity'でさまざまな非同期タスクに' Handler'を使用しています。 'setAelectedNavigationItem()'を新しい '' Runnable''として '' postAtFrontOfQueue() ''で単純に入れます。ブリリアント! – foxx1337

1

私はまったく同じ問題に遭遇しました。最後にそれを解決することができました。既に述べたように、タブを無効/有効にする方法はありません。そこ唯一の方法アウトがある - それは、これがませが、その後ので、

onTabSelected(ActionBar.Tab tab,FragmentTransaction fragmentTransaction) 

メソッド内から実行する必要があること、しかし

getActionBar().setSelectedNavigationItem(tab); 

注意を使用して戻って前のタブに行くことですそれは再帰的なループで立ち往生します。そのため、onTabSelected()内で、setSelectedNavigation()を実行するためにアクティビティハンドラにメッセージを送信します。

ここでキャッチするのは、実装時にわかります。setSelectedNavigationで渡す「タブ」の値です。そのためには、ユーザーがタブを押すか、コードを介して最後のタブに強制的に切り替えるかを追跡する必要があります。このため

public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 

    if (forcedTabSwitch) 
     forcedTabSwitch = false; 
    else 
     mTabToBeSwitchedTo = tab.getPosition(); 
} 

とハンドラで、

switch (msg.what) { 
      case SWITCH_TO_TAB : 
       forcedTabSwitch = true; 
          break; 
} 
+0

こんにちは、私のgetActionBar()。setSelectedNavigationItem(position)が動作しません。何が問題になるかもしれない、私はいくつかの条件でタブの位置を設定しようとしています。誰かが私を助けることができる.. – user448250

0

Iはまた、直面した同じproblem.Myアプリケーションには3つのタブを有し、各タブは次および前のタブに移動するボタンを有します。 タブを有効または無効にする方法が見つかりません。

以前に選択したタブ位置とブール値を保持するためにDataSetterクラスを使用して、タブの選択を決定しました。 booleanフラグがtrueの場合、ユーザーは次/前ボタンを押した。それ以外の場合は、ユーザーが許可しない を押してタブを選択しようとしています。
タブ選択のためにハンドラを使用しました。ユーザーが次のボタンをクリックすると、そのリクエストがブロードキャストされます。 ブロードキャストリクエストには、設定したい次または前のタブの位置である整数パラメータがあります。フラグメント内の コードは次のとおりです。

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) 
    { 
     View rootView = inflater.inflate(R.layout.first_tab_fragment, container, false); 
     next = (Button)rootView.findViewById(R.id.nextbutton); 
     next.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

      Intent intent = new Intent("TAB_CLICKED"); 
      Bundle bundle = new Bundle(); 
      bundle.putInt(MainActivity.POSITION,1); 
      intent.putExtras(bundle); 
      getActivity().sendBroadcast(intent); 
     } 
    }); 
    return rootView; 
    } 

私はタブのスワイプを防ぐためにCustomViewPagerの代わりViewPagerを使用していました。 CustomViewPagerクラスは次のとおりです。MainActivityのOnCreateのメソッド内

  public class CustomViewPager extends ViewPager {    

      private boolean enabled;    
      public CustomViewPager(Context context) { 
       super(context); 
      } 

      public CustomViewPager(Context context, AttributeSet attrs) { 
       super(context, attrs); 
      } 

      @Override 
      public boolean onTouchEvent(MotionEvent event) { 
       // TODO Auto-generated method stub 
       if (this.enabled) { 
        return super.onTouchEvent(event); 
       } 

       return false; 
      } 

      @Override 
      public boolean onInterceptTouchEvent(MotionEvent event) { 
       // TODO Auto-generated method stub 
       if (this.enabled) { 
         return super.onInterceptTouchEvent(event); 
        } 

        return false; 
      } 

      public void setPagingEnabled(boolean enabled) { 
       this.enabled = enabled; 
      }    
     } 

。最後にDataSetter.java

@Override 
    public void onTabSelected(Tab tab, FragmentTransaction ft) { 

    Log.d("MainActivity","onTabSelected"); 
    if(setter.getFlag() == true) 
    { 
     viewPager.setCurrentItem(setter.getposition()); 
    }   
} 

@Override 
public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
    // TODO Auto-generated method stub 
    Log.d("MainActivity","onTabUnselected");  
    //handler.sendEmptyMessage(0); 
    Message message = new Message(); 
    message.arg1 = setter.getposition(); 
    handler.sendMessage(message);  
} 

Handler handler = new Handler() 
{ 
    public void handleMessage(android.os.Message msg) 
    { 
     int arg1 = msg.arg1;    
     Log.d("arg1",arg1+""); 
     //viewPager.setCurrentItem(arg1); 
     mActionBar.setSelectedNavigationItem(arg1); 
     Log.d("handler","Inside handler"); 
    } 
}; 

BroadcastReceiver receiver = new BroadcastReceiver(){ 

    public void onReceive(Context context, android.content.Intent intent) { 

     String action = intent.getAction(); 
     Bundle bundle = intent.getExtras(); 
     int position = bundle.getInt(MainActivity.POSITION); 
     Log.d("Action",action); 
     Log.d("position",position+""); 
     setter.setposition(position); 
     setter.setflag(true); 
     Message message = new Message(); 
     message.arg1 = position; 
     handler.sendMessage(message); 
    }; 
    }; 
} 

public class DataSetter 
    { 
     int position; 
     boolean flag; 
     void setposition(int value) 
     { 
      position = value; 
     } 
     void setflag(boolean value) 
     { 
      flag = value; 
     } 
     int getposition() 
     { 
      return position; 
     } 
     boolean getFlag() 
     { 
      return flag; 
     } 
    } 

もっとあなたが見つけることができます:MainActivity.javaから

以下
 viewPager = (CustomViewPager) findViewById(R.id.pager); 
    viewPager.setPagingEnabled(false); 

残っているコード:Javaは、この2行を追加しますhttp://suhas1989.wordpress.com/2014/10/13/enable-or-disable-actionbar-tab-in-android/

関連する問題