【问题标题】:Android pass databundle from activity to fragments (tabs)Android 将数据包从活动传递到片段(选项卡)
【发布时间】:2014-03-18 12:29:50
【问题描述】:

我一直在尝试从 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);
}

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

标签片段示例

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

如果有人可以帮助我,我会很高兴

提前致谢

【问题讨论】:

    标签: android android-fragments android-tabs


    【解决方案1】:

    2 种快捷方式:

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

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

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

        private static int ticketId;
    
        public static int getCurrentTicketId(){
             return ticketId;
        }
    

    在你的片段中你可以这样做:

    TickerActivity.getCurrentTicketId();
    

    第二个选项,使用接口:

    public interface TicketListener{
        public void onTicketChanged(int newTicket);
    }
    

    并在您的活动中添加:

    public List<TicketListener> listeners = new ArrayList<TicketListener>();
    
    public void addListener(TicketListener listener){
        listeners.add(listener);
    }
    

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

    YourFragment frag = new YourFragment();
    addListener(frag);
    

    最后,当您想要通知侦听器的密钥时,遍历列表:

    for(TicketListener listener : listeners){
        listener.onTicketChanged(ticket);
    }
    

    【讨论】:

    • 似乎第一个选项最简单,但我仍然不明白如何使用它。如果我在 TicketActivity.java 中设置 getCurrectTicketId 我如何在片段中调用它?
    【解决方案2】:

    您可以通过两种不同的方式进行操作。更简单的是在您的 Activity 容器中必须为要从 Fragments 访问的数据提供一个 getter,因此在您的 Fragment 中必须通过 getActivity 访问这个 getter 以获取对父亲的引用并调用 get 方法,我的意思是:

    在 TicketActivity 中:

    private int ticketId;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    ...
    // Receive data
    Bundle bundle = getIntent().getExtras();
    ticketId = bundle.getInt("ticketId");
    ...
    }
    
    public int getTicketId() {
        return ticketId;
    }
    

    在你的片段中:

    ((TicketActivity)getActivity()).getTicketId();
    

    或者更优雅的方式是在初始化片段时通过参数传递 Bundle。您必须在 TicketTabsPagerAdapter 类中执行此操作。我的意思是这样的:

    TicketInfoFragment f = new TicketInfoFragment();
    f.setArguments(bundle);
    

    要做到这一点,最后一种方法最好使用单例模式。您可以点击下一个链接:http://developer.android.com/reference/android/app/Fragment.html

    public static class DetailsFragment extends Fragment {
    /**
     * Create a new instance of DetailsFragment, initialized to
     * show the text at 'index'.
     */
    public static DetailsFragment newInstance(int index) {
        DetailsFragment f = new DetailsFragment();
    
        // Supply index input as an argument.
        Bundle args = new Bundle();
        args.putInt("index", index);
        f.setArguments(args);
    
        return f;
    }
    
    public int getShownIndex() {
        return getArguments().getInt("index", 0);
    }
    

    【讨论】:

    • 这很有帮助!
    【解决方案3】:

    这很简单。当您将一个捆绑包从 ActivityA 传递到其他 ActivityB(带有捆绑包)时。它将由 ActivityB 类而不是片段接收。

    实现起来很简单: 在 ActivityB ==> 的 onResume 方法中接收捆绑包并将其附加到所需的片段。检查我的代码以从 onresume 传递到 Framgent 类

    String tag = Constants.TAG_Search;
    Fragment fragment;
    fragment = fragmentManager.findFragmentByTag(tag);
    fragmentTransaction.remove(fragment);
    Search searchFragment = new Search();
    searchFragment.setArguments(Globals.bd);
    fragmentTransaction.add(R.id.tab2, searchFragment, tag);
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多