【问题标题】:getTag() always returns null when called in fragmentgetTag() 在片段中调用时总是返回 null
【发布时间】:2014-08-14 17:17:59
【问题描述】:

我有一个问题,因为当我在片段中调用 getTag() 方法时返回 null,片段是我创建的 ViewPager 选项卡布局的一部分。

代码

import java.util.ArrayList;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.Toast;

public class HistoryFragment extends Fragment {
    ListView listView;
    HistoryAdapter adapter;
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View history = inflater.inflate(R.layout.fragment_history, container, false);
        ArrayList<ToSave> arrayOfData = new ArrayList<ToSave>();
        adapter = new HistoryAdapter(getActivity().getBaseContext(), arrayOfData);
        listView = (ListView) history.findViewById (R.id.listView1);
        listView.setAdapter(adapter);
        String myTag = getTag();
        ((MainActivity)getActivity()).setHistoryFragment(myTag);
        Toast.makeText(getActivity(), "HistoryFragment.onCreateView(): " + myTag, Toast.LENGTH_LONG).show();
        return history;
    }
}

我想用它在 Fragment 之间进行通信(通过单击另一个 Fragment 中的按钮添加 ListView 项),但我无法使其工作。

编辑

TabPagerAdapter.java

      @Override
      public Fragment getItem(int i) {
        switch (i) {
            case 0:
                if (mFragmentAtPos0 ==null) {
                    mFragmentAtPos0 = new PartyFragment(listener);
                }
                return mFragmentAtPos0;
            case 1:
                return new SummaryFragment();
            case 2:
                return new HistoryFragment();
            }
        return null;
      }

【问题讨论】:

  • 你在哪里为你的片段设置标签?
  • TabPagerAdapter 究竟扩展了哪个类?你也覆盖 getItemId() 吗?
  • 我假设您正在使用其中一个片段适配器并相应地更新了我的答案。

标签: android android-layout android-fragments android-listview android-viewpager


【解决方案1】:

Fragment 标签不会自动指定。您必须自己分配它们。根据您附加片段的方式,有几个地方可以做到这一点:在 XML 中或动态。

如果它是在 XML 中定义的,那么你可以这样设置:

<fragment android:name="com.example.news.ArticleListFragment"
            android:id="@+id/list"
            android:tag="your_tag"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="match_parent" />

如果你动态添加片段,那么你可以这样做:

ExampleFragment fragment = new ExampleFragment();
fragmentTransaction.add(R.id.fragment_container, fragment, "your_tag");
fragmentTransaction.commit();

在两个示例中都查找 "your_tag"

然后,当您向Fragment 调用getTag() 时,您将得到"your_tag" 作为结果。


如果使用将您的片段提供给FragmentPagerAdapter,标签会根据getItemId(int) 自动分配,默认情况下会返回寻呼机位置。所以调用getTag() 将返回ViewPager 中的片段位置。


如果使用FragmentStatePagerAdapter 片段标签被指定。如果是这种情况,您必须切换到第一个适配器类型或使用其他方式来引用您的片段。

从你的适配器的实现我知道你只有 3 页,所以FragmentPagerAdapter 更适合你。

作为证据,这是来自FragmentStatePagerAdapter 的描述的一部分:

这个版本的寻呼机在人多的时候比较有用 页面,更像是一个列表视图。

以及来自FragmentPagerAdapter的下一个描述:

这个版本的寻呼机最适合在有少数人的情况下使用 通常需要分页的更多静态片段,例如一组 选项卡。


如果您坚持使用 FragmentStatePagerAdapter,请继续阅读:

我假设您以后需要标签来找到您的片段。相反,标签保留对片段的引用。您的 Activity 方法 ((MainActivity)getActivity()).setHistoryFragment(myTag); 已经期望特定类型的片段。所以你可以这样称呼它((MainActivity)getActivity()).setHistoryFragment(this); 稍后,而不是搜索片段,检查它是否不为空并使用它。

【讨论】:

  • 请看我编辑的帖子。我不知道如何在我拥有的代码中添加标签
  • 我正在使用FragmentStatePagerAdapter,但即使在您的帖子中覆盖onCreate() 方法后,getTag() 仍然返回null。
  • @DamianPetla 您如何为 XML 中未使用 语法设计的片段设置标签?例如,我的片段以编程方式使用布局 XML 文件进行膨胀。有没有办法在onCreateView中使用这个方法设置标签?
  • @Chris-Jr Fragment 的tag 具有包可见性,并且仅供FragmentManager 使用。我不知道你为什么需要标签来做其他事情。也许解释你的最终目标,我会尝试找到解决方案,如果你发布一个新问题,那就完美了。
  • @DamianPetla 我实际上已经弄清楚了问题所在,并且标签开始起作用。不幸的是,我不记得现在是什么了,但感谢您的帮助。
猜你喜欢
  • 2013-03-30
  • 1970-01-01
  • 1970-01-01
  • 2020-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多