Tôi cũng phải đối mặt với cùng một ứng dụng problem.My có ba tab và mỗi tab có nút để chuyển sang tab tiếp theo và trước đó. Tôi không tìm thấy bất kỳ phương pháp nào để bật hoặc tắt tab.
Tôi đã sử dụng lớp DataSetter để giữ vị trí tab đã chọn trước đó và giá trị boolean để xác định lựa chọn tab. Nếu cờ boolean là đúng thì người dùng đã nhấn nút tiếp theo/trước đó. Nếu không, người dùng đang cố gắng chọn tab bằng cách nhấn chúng mà chúng tôi không cho phép.
Tôi đã sử dụng trình xử lý để chọn tab.Phần bên trong khi người dùng nhấp vào nút tiếp theo Tôi phát sóng yêu cầu đó. Yêu cầu phát sóng có tham số nguyên là vị trí của tab tiếp theo hoặc trước đó mà chúng tôi muốn đặt. Mã bên trong phân đoạn là:
@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;
}
Tôi đã sử dụng CustomViewPager thay vì ViewPager để ngăn chặn việc vuốt tab. Lớp CustomViewPager là:
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;
}
}
Phương pháp onCreate bên trong của MainActivity.java thêm này hai dòng: Mã
viewPager = (CustomViewPager) findViewById(R.id.pager);
viewPager.setPagingEnabled(false);
Dưới đây còn lại từ MainActivity.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);
};
};
}
Cuối cùng 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;
}
}
hơn bạn có thể tìm thấy trên: http://suhas1989.wordpress.com/2014/10/13/enable-or-disable-actionbar-tab-in-android/
Vâng, tôi hiểu rồi! Cảm ơn. Tôi đã quản lý để thêm một hành vi kỳ lạ bằng cách thêm một kiểm tra trên TabListener, nếu tôi "có thể" thay đổi các tab tôi thay đổi, nếu không tôi chọn lại tab mới nhất = P – DaniloBertelli
@DaniloBertelli Cách giải quyết của bạn không đơn giản. Để cập nhật tab đã chọn Xem đúng cách "chọn lại tab mới nhất" sẽ cần phải có trong hàng Runnable được xếp hàng đợi qua một bài đăng trên một trong các chế độ xem. Nếu bạn thực sự muốn biết lý do tại sao hãy tìm trong ScrollingTabContainerView # TabClickListener.onClick - như cuộc gọi tab.select của bạn sẽ cần phải sau cuộc gọi đến [child.setSelected] (http://is.gd/OCa2tF) trong phương thức đó. – Daniel
@Daniel không có đủ ký tự trong hộp nhập này để thể hiện lời cảm ơn của tôi. Về cơ bản tôi đã sử dụng một 'Handler' cho các nhiệm vụ async khác nhau trong' Activity' của tôi, tôi chỉ cần đặt 'setSelectedNavigationItem()' là một '' Runnable'' mới với '' postAtFrontOfQueue() '' ở đó. Rực rỡ! – foxx1337