Articles of android fragments

片段 – 我应该在onCreateView中重用视图,我该怎么做?

实际上,我总是在我的片段中重用我的视图,如下所示: private View mView = null; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if (mView == null) mView = inflater.inflate(R.layout.view); return mView; } 这有效,有viewpager等。 现在我开始在简单的活动中使用我的片段,并且当且仅当我将片段添加到backstack时,由于java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child’s parent first. ,这将失败java.lang.IllegalStateException: The specified child already has a parent. You must call […]

在按下后更新导航抽屉的选定状态

什么是在按下后处理导航抽屉的选定状态的正确方法? 我有一个带有n个条目的导航抽屉(在列表视图中),就像Android Studio中的SDK示例一样。 当我点击导航抽屉条目时,我希望它们被添加到后台堆栈,所以我可以回到它们。 在onNavigationDrawerItemSelected(int pos)我有 FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); if (position == 0) { transaction.replace(R.id.container, new FragmentA()); } else if (position == 1) { transaction.replace(R.id.container, new FragmentB()); } else { transaction.replace(R.id.container, new FragmentC()); } transaction.addToBackStack(null); transaction.commit(); 当我点击抽屉中的第二个条目时,B被选中并替换A.如果我之后单击后退按钮,片段A将再次显示,但仍然在导航抽屉中选择了B. 如何在按下后更新抽屉的选择状态? 不知何故,我需要调用mDrawerListView.setItemChecked(position,true); 或NavigationDrawerFragment.selectItem(int position)。 但到了哪个位置? 我怎么记得呢? 拦截onBackPressed? @Override public void onBackPressed() {} 但我怎么知道哪个片段再次活跃? […]

活动中的OnOptionsItemSelected在fragment中的onOptionsItemSelected之前调用。 其他方式可能吗?

我有一个活动,可以包含几个片段。 每个片段都可以在ActionBar中拥有自己的菜单条目。 到目前为止,此工作正常,每个项目都是可点击的,并执行所需的操作。 我的问题如下。 在MainActivity中,我声明了以下几行来拦截对ActionBar的HomeIcon的调用: public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: clearBackStack(); setHomeFragment(); return true; default: return super.onOptionsItemSelected(item); } } 我在Activity中声明它,因为我希望每个Fragment都应该调用它,这样我就不必捕获每个片段中的android.R.id.home情况。 在一个片段中,我使用的是setDisplayHomeAsUpEnabled(true),这样我就可以获得ActionBar图标左侧的小箭头。 当在这个片段中单击HomeIcon时,我不想设置HomeFragment,我想设置上次显示的片段。 所以我有一个onOptionsItemSelected – 片段中的方法: @Override public boolean onOptionsItemSelected(MenuItem menuItem) { switch (menuItem.getItemId()) { case android.R.id.home: setLastFragment(); return true; … 但是,这并不像我希望的那样工作。 首先调用Activity的onOptionsItemSelected,捕获MenuItem并重定向到HomeFragment。 使用在其他片段中声明的其他MenuItem,我可以检查看到相同的行为。 首先调用Activity,不捕获MenuItem(默认情况),然后重定向到super.onOptionsItemSelected(item)。 因此,Android处理菜单点击的情况似乎就是这样。 第一个活动,然后是片段。 有没有办法改变这个? 我不想把android.R.id.home-case放在每个片段中并在那里处理它。 有没有更好的方法来做到这一点?

(ActionBar)选项卡+寻呼机+详细信息ViewPager容器内的碎片

对于ActionBarSherlock,我想要(Action Bar)Tabs + Pager。 我在该寻呼机容器中使用Fragments。 我已经得到了http://actionbarsherlock.com/工作的例子,但是当我点击第一个片段中的一个listitem时,我无法设法在该寻呼机容器中获取一个细节片段。 有这样的事情是不可能的: Tabs和pager容器的活动 片段Tab1下的内部寻呼机容器 单击片段A中的内容并在Tab1下的同一个寻呼机容器中显示片段B. 然后片段A不可见,只有片段B可见,但也可见所有标签。 目前我认为只有一个新的活动(在其中包含片段B)可以在片段A中单击某些内容后启动。

将片段添加到对话框中

我想在对话框中添加一个片段(它可以是DialogFragment或常规Dialog)。 我怎么做? 这是我的DialogFragment: public class MyDialogFragment extends DialogFragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { MyDialogFragment2 dialog = new MyDialogFragment2(); View v = inflater.inflate(R.layout.news_articles, container, false); getActivity().getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, dialog).commit(); return v; } } 这是news_article.xml: 这是我的主要活动: @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { MyDialogFragment […]

更改语言环境后未调用onConfigurationChange

我必须从一个片段刷新语言更改的片段内容。 所以我想到使用onConfigurationChange方法,该方法在我的Main活动中(此活动控制所有片段)并在更改语言环境时重新创建所有片段。 但是这种方法不是在改变语言环境时调用的。 我在清单文件的activity标记下包含了locale。 在改变方向时调用onConfigurationChange。 我正在改变此链接中给出的语言在Android及其工作中以编程方式更改语言 。 有人可以澄清解决此问题需要做哪些更改。

为什么片段的onCreate()有时在Activity的onCreate()之前被调用?

最近我遇到了一个难以重现的问题。 当片段尝试使用Activity中的数据初始化ArrayAdapter时,会发生NPE。 在Activity的onCreate方法中初始化的默认列表: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // … mAccounts = new ArrayList(); // … } @Override public List getAccounts(){ return mAccounts; } 该片段还在其onCreate()中创建了一个列表适配器: @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); setHasOptionsMenu(true); //mAccountProvider is an interface implemented by the activity mAccounts = mAccountProvider.getAccounts(); mAccountAdapter = new AccountAdapter(getActivity(), R.layout.account_list_item, mAccounts); } 调用默认的getCount()方法时,NPE发生在AccountAdapter内部。 […]

ViewPager – 并不总是调用onCreateView

我有一个10页的ViewPager。 当我启动最后一个(第10个)页面onCreateView() ,调用我片段的方法。 当我滑到第9页onCreateView()也被调用。 但是当我回到第10页onCreateView()没有被调用。 怎么了?

如何在onclick期间切换片段?

我有一个我想做的项目。 我遇到了一个小问题,我不知道如何绕过它。 下面是目前为止的应用程序的图像。 我想要它做的是当用户点击其中一个列表项时,显示“Hello!It’s Fragment2”的部分更改为我在应用程序中声明的新xml。 因此,如果我单击ATO listItem,那么右侧的片段应该更改为“Hello!It’s ATO Fragment” 这是我到目前为止的代码: AndroidListFragmentActivity: package com.exercise.AndroidListFragment; import android.app.Activity; import android.os.Bundle; public class AndroidListFragmentActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } } Fragment2: package com.exercise.AndroidListFragment; import android.app.Fragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; […]

如何从导航栏中打开一个新片段?

我正在使用developer.android.com指南来构建应用程序。 当我在Android Studio中创建一个新项目时,我选择了“导航:导航抽屉”。 我在互联网上搜索了我的问题的答案,但我找不到任何有用的。 对此抱歉,我是编程新手。 单击导航抽屉时,如何让我的应用在主视图中打开一个新片段? 单击导航抽屉时,是否可以使用标签打开多个可滑动的片段? 如何使“标题”可扩展/可折叠? http://developer.android.com/design/patterns/navigation-drawer.html http://developer.android.com/training/implementing-navigation/nav-drawer.html 这就是我希望布局如下: title_section * not section_title;)