我想发布一个新片段来查看一些数据。目前,我有一个主要活动,其中包含一堆操作栏选项卡,每个选项卡都是一个片段。所以,在一个标签片段中,我有一个按钮,chartButton。我的onclicklistener都设置好了,这是onClick方法:
public OnClickListener chartsListener = new OnClickListener() {
@Override
public void onClick(View v) {
Intent chartFragment = new Intent();
startActivity(chartFragment);
}
};
现在,正如我所说,这个监听器属于扩展Fragment的类。所以,我想通过意图更换整个屏幕来启动一个新的片段(chartsFragment)。当用户点击回来时,它会将它们带回标签和主要活动。这是我的图表片段:
public class chartsFragment extends Fragment {
public View onCreateView() {
//LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState
LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
return (inflater.inflate(R.layout.chartfragment, null));
}
}
我正在处理的当前错误:“android.content.ActivityNotFoundException:找不到处理Intent {}的活动”。这很好,我知道我可以使用getActivity()。startActivity(chartsFragment),但这会导致相同的错误。我想我在这里寻找的是,如何从片段中启动一个导致打开新片段的意图?
答案 0 :(得分:50)
您的问题的答案很简单:用新的Fragment
替换当前的Fragment
并将事务推送到backstack。这样可以保留后退按钮的行为......
创建一个新的Activity
实际上打败了使用片段的全部目的......非常适得其反。
@Override
public void onClick(View v) {
// Create new fragment and transaction
Fragment newFragment = new chartsFragment();
// consider using Java coding conventions (upper first char class names!!!)
FragmentTransaction transaction = getFragmentManager().beginTransaction();
// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);
// Commit the transaction
transaction.commit();
}
http://developer.android.com/guide/components/fragments.html#Transactions
答案 1 :(得分:19)
您无法打开新片段。片段需要始终由活动托管。如果片段处于相同的活动(例如制表符),那么后退键导航将变得棘手我假设您要打开具有该片段的新屏幕。
因此,您只需创建一个新活动并将新片段放在那里。然后,该活动将通过活动类明确地或通过intent filter
隐式地对意图做出反应。
答案 2 :(得分:5)
试试这可能会对你有所帮助:
public void ButtonClick(View view) {
Fragment mFragment = new YourNextFragment();
getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, mFragment).commit();
}
答案 3 :(得分:0)
试试这可能会对你有所帮助:
private void changeFragment(Fragment targetFragment){
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.main_fragment, targetFragment, "fragment")
.setTransitionStyle(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
.commit();
}