我有一个问题,因为当我在片段中调用它时,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项目),但我无法使其工作。
@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;
}
答案 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);
稍后,不要搜索片段,检查它是否为空并使用它。