Articles of android fragments

Fragments作为静态内部类与独立公共类背后的设计逻辑是什么?

我无法理解我刚刚开始使用的Android软件设计的一个重要方面,据我所知, Fragment设计已被采用以解耦代码,其中直觉是Activity保持原样而Fragment可以在其他地方,甚至可能在不同的活动中,或者可能与其他片段一起使用,例如主/细节流程或横向UI。 好吧所以我已经看到了很多关于SO的问题,询问为什么Fragments被放置为Activity静态内部类,答案是如果我们不将它们设置为静态, Fragment可能会引用活动和像屏幕旋转或重新绘制之类的东西可能会泄漏活动或其他东西。 这让我回到原点,我有一个问题,那就是,如果为了解耦代码而采用了Fragment设计,那么为什么我们将Fragment与Activity放在一起,将它放在 Activity类中而不是放入他们作为独立的公共课程? 这与碎片的存在完全不矛盾吗? 具有项目结构的缺点是什么? 每个Fragment都是自己独立的类? 鉴于我的片段代码可以增长到1000行,特别是在尝试制作animation时,我发现这更加整洁,分离并且可以在除了预期的父活动之外的活动中重复使用。 我们还遇到上面提到的内存泄漏问题吗? 我错过了一些关于设计逻辑的东西吗? 请教育我。 有没有一种方法可以将Fragments保留为内部类并仍在其他地方使用? 我可能也会在这里遗漏一些东西……所以请告诉我。 任何其他项目设计方法,概念,对我的直觉的更正都非常受欢迎,因为我刚刚开始在这里,我很想知道我的所有选择。 谢谢 :)

FragmentManager中的NullPointerException

我正在使用Android兼容性库,偶尔会得到一个奇怪的NullPointerException : java.lang.NullPointerException at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:960) at android.support.v4.app.FragmentManagerImpl.performPendingDeferredStart(FragmentManager.java:768) at android.support.v4.app.FragmentManagerImpl.startPendingDeferredFragments(FragmentManager.java:1104) at android.support.v4.app.LoaderManagerImpl$LoaderInfo.onLoadComplete(LoaderManager.java:410) at android.support.v4.content.Loader.deliverResult(Loader.java:103) at android.support.v4.content.CursorLoader.deliverResult(CursorLoader.java:81) at android.support.v4.content.CursorLoader.onStartLoading(CursorLoader.java:126) at android.support.v4.content.Loader.startLoading(Loader.java:197) at android.support.v4.app.LoaderManagerImpl$LoaderInfo.start(LoaderManager.java:262) at android.support.v4.app.LoaderManagerImpl.doStart(LoaderManager.java:710) at android.support.v4.app.Fragment.onStart(Fragment.java:981) at android.support.v4.app.Fragment.performStart(Fragment.java:1332) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:906) at android.support.v4.app.FragmentManagerImpl.attachFragment(FragmentManager.java:1240) at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:612) at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1416) at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:431) at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:139) at android.support.v4.view.ViewPager.populate(ViewPager.java:804) at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:433) at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:405) at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:386) … 显然,我做错了,让FragmentManager进入这样一个可能会崩溃的状态,但我不知道是什么。 FragmentManagerImpl的相关代码并未向我提供任何线索。 我猜测mActivity在某种程度上是null的? 但这似乎是不可能的,因为活动已经在屏幕上,我没有添加任何片段 – 只是在ViewPager切换它们。

从Fragment启动Activity时未调用onActivityResult()

我在从Android中的相册导入图片时遇到问题,因为从不调用onActivityResult()方法。 这是我写的代码(从片段调用而不是活动): Intent galleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); getActivity().startActivityForResult(galleryIntent, PICK_IMAGE); 顺便说一句,我已经定义了onActivityResult()但它从未被触发: @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { Log.d(TAG, “onActivityResult”); // not printed } 知道这有什么问题吗? 谢谢!

在Fragment类中显示ProgressDialog

我试图在Fragment类中显示ProgressDialog 。 以下代码仅适用于Activity类,但不适用于Fragment 。 有人可以帮我解决这个问题,为什么这个ProgressDialog实现只适用于Activity而不是Fragment ? private class ProcessUpdateProfile extends AsyncTask { private ProgressDialog nDialog; @Override protected void onPreExecute() { super.onPreExecute(); nDialog = new ProgressDialog(PFragment.this); //Here I get an error: The constructor ProgressDialog(PFragment) is undefined nDialog.setMessage(“Loading..”); nDialog.setTitle(“Checking Network”); nDialog.setIndeterminate(false); nDialog.setCancelable(true); nDialog.show(); } }

Google PlacePicker在发布后立即关闭

我正在开发一个Android应用程序,并正在研究Google Places以获取应用程序中的某些function。 谷歌最近发布了我正在使用的PlacePickerfunction。 我遵循了谷歌指南和快速入门指南“T”。 这个function在三小时前工作得很好,现在当我去测试它时,它启动然后立即关闭,堆栈跟踪中没有错误。 以下是我使用代码的方式: 这是一个片段。 // The Location Selection from Google Place Picker where.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { try { launchPlace(); } catch (GooglePlayServicesNotAvailableException | GooglePlayServicesRepairableException e) { e.printStackTrace(); } } }); 这是在onCreateView的片段内。 方法launchPlace()定义如下。 // Start Google Place Picker Code ************************************************************** public void launchPlace() throws GooglePlayServicesNotAvailableException, GooglePlayServicesRepairableException { PLACE_PICKER_REQUEST […]

FloatingActionButton扩展为一个新活动

在android材料设计原则页面上,其中一个示例显示了FAB扩展到新的全屏。 (在“全屏”下) http://www.google.com/design/spec/components/buttons-floating-action-button.html#buttons-floating-action-button-transitions 我试图在我的应用程序中实现相同的效果,但收效甚微。 我设法使用此代码作为参考创建了一个扩展为视图的FAB: https : //gist.github.com/chris95x8/882b5c5d0aa2096236ba 。 它有效,但我想知道我是否可以对活动过渡应用相同的效果。 我已经尝试过查找并自己玩它但找不到任何可行的东西。 我知道我可以让FAB扩展成片段而不是一个全新的活动,但我不确定这是做什么的,以及这是否是最佳的。 所以我的问题是,有没有办法将fab扩展显示效果实现为活动转换,还是应该只显示一个新片段?

无法通过ActivityInstrumentationTestCase2测试FragmentActivity

我在使用最近发布的Fragment支持API的Android应用程序执行androidunit testing时遇到问题。 对FragmentActivity运行测试时,日志中会显示以下错误,并且无法加载类。 当针对相同的类运行,但是从Activity派生的一个时,测试工作正常。 这两个类都可以正常用作应用! 这意味着只需调用它们就可以正确显示它们的布局和function。 支持jar是构建路径的一部分,并包含在项目中。 我遇到的问题是利用片段(并支持pre3.0 android)的唯一方法是利用FragmentActivity,但如果不包括自动化测试那么这个库有什么用处。 4-05 18:00:11.276: WARN/dalvikvm(1095): Class resolved by unexpected DEX: Lcom/example/android/app/FragmentLayoutSupport;(0x406351a0):0x12e5c8 ref [Landroid/support/v4/app/FragmentActivity;] Landroid/support/v4/app/FragmentActivity;(0x406351a0):0x12e440 04-05 18:00:11.276: WARN/dalvikvm(1095): (Lcom/example/android/app/FragmentLayoutSupport; had used a different Landroid/support/v4/app/FragmentActivity; during pre-verification) 04-05 18:00:11.286: WARN/dalvikvm(1095): Unable to resolve superclass of Lcom/example/android/app/FragmentLayoutSupport; (49) 04-05 18:00:11.286: WARN/dalvikvm(1095): Link of class ‘Lcom/example/android/app/FragmentLayoutSupport;’ failed 04-05 18:00:11.286: ERROR/dalvikvm(1095): Could not […]

更改屏幕旋转时ViewPager片段消失

我正在开发包含带有Fragment的ViewPager android应用程序,如下所示: MainActivity ( MainActivityFragment ( screenSlideViewPager ( Fragment s))),表示: Activity 包含 Fragment 包含的 ViewPager 包含 Fragment 现在我的问题是当旋转设备或更改屏幕旋转时,ViewPager中的所有片段都会消失。 有什么想法来解决这个问题吗? 编辑1 MainActivity.java: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getSupportFragmentManager().findFragmentByTag(TAG) == null) { final FragmentTransaction ft = getSupportFragmentManager() .beginTransaction(); ft.add(android.R.id.content, new MainActivityFragment(), TAG); ft.commit(); } } MainActivityFragment.java: public class MainActivityFragment extends Fragment { private ViewPager […]

从适配器调用Fragment方法

我的片段中有一个方法sendData() 。 此方法启动一个新的Activity。 我想从我的ArrayAdapter调用此方法。 这是我的代码: – HomeFragment.java stagAdaper = new StaggeredAdapter(myContext, android.R.layout.simple_list_item_1, getList); mGridView.setAdapter(stagAdaper); private void sendData(int position) { myDialog = new ProgressDialog(myContext).show(getActivity(), “Fetching news..”, “Just a moment”); myDialog.getWindow().setContentView(R.layout.openarticlewaitprogress); myDialog.getWindow().setTitle(“Loading..”); myDialog.getWindow().setLayout(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); new NewsDetails(myDialog); Intent nIntent = new Intent(getActivity(),Details.class); String Body=getList.get(position).getBody(); newsIntent.putExtra(“Body”, Body); startActivity(nIntent); } StaggeredAdapter.java viewHolder.layGridLayout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { […]

片段切换期间替代onResume()

当我们在片段之间切换多次时,不会调用onResume()方法。 那么,有没有更好的方法来处理恢复操作?