在fragment中调用时,getTag()始终返回null

时间:2014-08-14 17:17:59

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

我有一个问题,因为当我在片段中调用它时,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;
    }
}

我想将它用于Fragments之间的通信(通过单击另一个片段中的按钮添加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;
      }

1 个答案:

答案 0 :(得分:12)

不会自动指定

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();

在这两个示例中,请查找&#34; your_tag&#34;

然后,当您getTag()致电Fragment时,您将获得&#34; your_tag&#34; 作为结果。


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


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

从适配器的实现中我知道您只有3页,因此FragmentPagerAdapter更适合您。

作为证明,这是FragmentStatePagerAdapter的描述的一部分:

  

当有大量的寻呼机时,此版本的寻呼机更有用   页面,更像是列表视图。

以及FragmentPagerAdapter的下一个说明:

  

此版本的寻呼机最适合在少数人使用时使用   通常会有更多静态片段被分页,例如一组   标签。


如果你坚持使用FragmentStatePagerAdapter继续阅读:

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