【问题标题】:Start a fragment via Intent within a Fragment通过 Fragment 中的 Intent 启动 Fragment
【发布时间】:2012-04-07 13:43:41
【问题描述】:

我想启动一个新片段来查看一些数据。目前,我有一个主要活动,其中包含一堆操作栏选项卡,每个选项卡都是一个片段。所以,在一个标签片段中,我有一个按钮,chartsButton。我已经为它设置了我的 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),但这会导致同样的错误。我想我在这里寻找的是如何从片段中启动意图以打开新片段?

【问题讨论】:

标签: android android-intent android-fragments


【解决方案1】:

您的问题的答案很简单:用新的Fragment 替换当前的Fragment 并将事务推送到后台堆栈。这保留了后退按钮的行为...

创建一个新的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

【讨论】:

  • 只有当两个片段都由同一个活动托管时才有效
  • 也许吧,但为什么值得注意呢?我的所有应用程序中只有一项活动。这就是重点,不是吗?限制活动数量?
【解决方案2】:

您无法打开新片段。片段需要始终由活动托管。如果片段在同一个活动中(例如选项卡),那么后退键导航会很棘手,我假设你想用那个片段打开一个新屏幕。

因此,您只需创建一个新活动并将新片段放入其中。然后,该活动将通过活动类显式或通过intent filters 隐式对意图作出反应。

【讨论】:

  • 这非常有效。我刚刚创建了一个名为 Chart 的新类,让它扩展 Activity,将它放在 Manifest 中,并让它加载我打算用于片段的 xml 布局。背面功能也可以按我的意愿工作。非常感谢!
  • 哇,这似乎有点过头了。为什么不直接用新的片段替换当前片段并将当前片段推入后台?!?!?! developer.android.com/guide/components/…
  • 并确保您可以打开新的片段!
【解决方案3】:

试试这个可能对你有帮助:

public void ButtonClick(View view) {
    Fragment mFragment = new YourNextFragment(); 
    getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, mFragment).commit();
}

【讨论】:

    【解决方案4】:

    试试这个可能对你有帮助:

    private void changeFragment(Fragment targetFragment){
    
        getSupportFragmentManager()
             .beginTransaction()
             .replace(R.id.main_fragment, targetFragment, "fragment")
             .setTransitionStyle(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
             .commit();
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多