Android将databundle从活动传递到片段(标签)

Nie*_*els 0 android android-fragments android-tabs

我一直试图从listview-onclicklistener获取一个id到三个标签片段.用户首先单击myTicketsFragment,然后转到包含3个可滑动标签的详细信息页面.这些视图由名为TicketActivity的一个单独活动"托管".所以目前我已经成功地将数据从片段传递到TicketActivity,但我不能做得更远.一直在寻找2个小时但仍然没有结果..

这是我的代码:

myTicketsFragment:将setOnItemClickListener中的数据传递给制表符活动

public void onItemClick(AdapterView<?> parentView,
                        View childView, int position, long id) {

                    Bundle bundle = new Bundle();
                    bundle.putInt("ticketId", myTickets.get(position).getId());
                    Intent ticketDetail = new Intent(getActivity(), TicketActivity.class);
                    ticketDetail.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    ticketDetail.putExtras(bundle);
                    startActivity(ticketDetail);
}
Run Code Online (Sandbox Code Playgroud)

TicketActivity:接收数据并将其传递给3个选项卡

private ViewPager viewPager;
private TicketTabsPagerAdapter mAdapter;
private ActionBar actionBar;
// Tab titles
private String[] tabs = { "Info", "Intern", "Extern" };

public TicketInfoFragment ticketInfoFragment;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.tabs);

    // Receive data
    Bundle bundle = getIntent().getExtras();
    int ticketId = bundle.getInt("ticketId");

            // Pass data to fragments
            // ...

    // Initilization
    viewPager = (ViewPager) findViewById(R.id.pager);
    actionBar = getActionBar();
    mAdapter = new TicketTabsPagerAdapter(getSupportFragmentManager());

    viewPager.setAdapter(mAdapter);
    actionBar.setHomeButtonEnabled(true);
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    // Adding Tabs
    for (String tab_name : tabs) {
        actionBar.addTab(actionBar.newTab().setText(tab_name)
                .setTabListener(this));
    }

    /**
     * on swiping the viewpager make respective tab selected
     * */
    viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

        @Override
        public void onPageSelected(int position) {
            // on changing the page
            // make respected tab selected
            actionBar.setSelectedNavigationItem(position);
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
        }

        @Override
        public void onPageScrollStateChanged(int arg0) {
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

选项卡片段的示例

public class TicketInfoFragment extends Fragment {

TicketFull ticket = new TicketFull();
private DatabaseHelper db;
int ticketId;
String androidId;
String authCode;
String platform_url;
int uId;

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);

    db = new DatabaseHelper(getActivity());
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    View rootView = inflater.inflate(R.layout.fragment_ticket_info, container, false);

    return rootView;
}
}
Run Code Online (Sandbox Code Playgroud)

如果有人能帮助我,我会很高兴的

提前致谢

Gui*_*ino 5

2快速方式:

  1. 在您的活动中使用静态方法来检索当前的故障单ID

  2. 设计并实现一个接口,并将片段注册为活动中的侦听器

第一个选项,在您的活动中:

    private static int ticketId;

    public static int getCurrentTicketId(){
         return ticketId;
    }
Run Code Online (Sandbox Code Playgroud)

在你的片段中你可以做到:

TickerActivity.getCurrentTicketId();
Run Code Online (Sandbox Code Playgroud)

第二个选项,使用界面:

public interface TicketListener{
    public void onTicketChanged(int newTicket);
}
Run Code Online (Sandbox Code Playgroud)

并在您的活动中添加:

public List<TicketListener> listeners = new ArrayList<TicketListener>();

public void addListener(TicketListener listener){
    listeners.add(listener);
}
Run Code Online (Sandbox Code Playgroud)

并将每个片段注册为新的侦听器

YourFragment frag = new YourFragment();
addListener(frag);
Run Code Online (Sandbox Code Playgroud)

最后当你想通知监听器的密钥迭代列表时:

for(TicketListener listener : listeners){
    listener.onTicketChanged(ticket);
}
Run Code Online (Sandbox Code Playgroud)