2012-03-06 81 views
8

我正在開發使用新Tabs系統(ActionBar.addTab())的應用程序,我將有3個選項卡。 在一個確定的過程中,我想鎖定(禁用)其中兩個(不刪除,只是不接受點擊,不改變'選擇器'啓用/禁用Android ActionBar.Tab

我能夠不改變內容(通過實施TabListener並沒有改變片段等),但選擇的變化。

反正是有隻禁用/啓用選項卡?沒有必須刪除並重新添加?提前

謝謝! BR, 達尼洛

回答

2

對不起,沒有「啓用「或」禁用「標籤在操作欄中。正如你注意到的,你可以刪除並重新添加它們 - 這是最接近你可以得到AFAIK。

+3

是的,我明白了!謝謝。我有經理通過在TabListener上添加一個檢查來添加一個奇怪的行爲,如果我「可以」更改我更改的選項卡,如果不是,我重新選擇最新的選項卡= P – DaniloBertelli 2012-03-12 13:14:56

+2

@DaniloBertelli您的解決方法並不那麼簡單。爲了更新選定的選項卡,正確地查看您的「重新選擇最新的選項卡」需要位於通過其中一個視圖的帖子排隊的Runnable中。如果你真的想知道爲什麼然後看看ScrollingTabContainerView#TabClickListener.onClick - 因爲你的tab.select調用需要在該方法調用[child.setSelected](http://is.gd/OCa2tF)之後。 – Daniel 2013-10-03 22:42:20

+0

@Daniel這個輸入框中沒有足夠的字符來表達我的感謝。基本上我已經在我的Activity中爲各種異步任務使用了一個'Handler',我簡單地把'setSelectedNavigationItem()'作爲一個新的''Runnable''用''postAtFrontOfQueue()''在那裏。輝煌! – foxx1337 2014-01-15 14:53:42

1

我陷入了完全相同的問題。終於能夠解決它。如前所述,無法禁用/啓用選項卡。只有一個出路 - 這是使用

getActionBar().setSelectedNavigationItem(tab); 

不過請注意,以返回到前一個標籤,這應該

onTabSelected(ActionBar.Tab tab,FragmentTransaction fragmentTransaction) 

方法中完成的,因爲那樣的話它被卡在遞歸循環中。因此,在onTabSelected()中 - 向Activity Handler發送消息以執行setSelectedNavigation()。

這裏的一個問題是(你會知道什麼時候實現):在setSelectedNavigation中傳遞什麼「tab」值。爲此,我們必須跟蹤用戶是否按下了標籤開關或通過代碼強制切換到最後一個標籤。

對於此:

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 2015-06-04 04:57:13

0

我也面臨同樣的problem.My應用程序有三個選項卡和每個標籤都有按鈕移動到下一個和前一個標籤。 我沒有找到任何啓​​用或禁用選項卡的方法。

我使用DataSetter類來保存先前選擇的標籤位置和布爾值來確定選項卡選擇。 如果布爾標誌爲真,則用戶按下一個/上一個按鈕。否則,用戶正嘗試通過按 選擇標籤,這是我們不允許的。
我使用處理程序選項卡selection.Inside片段,當用戶點擊下一個按鈕我廣播該請求。 廣播請求有整數參數,它是我們要設置的下一個或上一個選項卡的位置。內部片段 代碼是:

@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類是:

  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; 
      }    
     } 

內部MainActivity的onCreate方法。java的添加此兩行:從MainActivity.java

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

下面是剩餘代碼:

@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); 
    }; 
    }; 
} 

最後DataSetter.java:

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; 
     } 
    } 

更多,你可以找到:http://suhas1989.wordpress.com/2014/10/13/enable-or-disable-actionbar-tab-in-android/