Articles of android fragments

是否最好使用Activity.onAttachFragment或Fragment.onAttach在Activity和嵌套片段之间进行通信?

Android文档建议,要从活动到托管片段进行通信,片段可以定义回调接口,并要求主机活动实现它。 基本模式涉及在片段中实现onAttach ,并将活动转换为回调接口。 请参阅http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity 。 这是一个为片段提供一些初始化数据以及监听导航回调的示例。 public class HostActivity extends Activity implements FragmentHost { @Override UiModel getUiModel() { return mUiModel; } @Override FragmentNavListener getNavListener() { return mNavListener; } … } public class HostedFragment extends Fragment { @Override public void onAttach(Activity activity) { super.onAttach(activity); if (activity instanceof FragmentHost) { FragmentHost host = (FragmentHost) activity; setUiModel(host.getUiModel()); setNavListener(host.getFragmentNavListener()); […]

从WebView打开softinput时,Android窗口不会resize/平移

我的问题是以下。 应用程序使用主题android:Theme.NoTitleBar.Fullscreen并且只有一个Activity ,所有其他视图都是Fragment 我在ViewPager Fragment有WebView ,它位于ScrollView HTML内容包含输入字段 我单击WebView底部的输入字段 软输入打开,但Window未resize/平移 我已经尝试在我的清单中为Activity设置android:windowSoftInputMode=”adjustResize”或android:windowSoftInputMode=”adjustPan” 。 还尝试在java中设置其中一个。 我的应用程序中ScrollView内部的正常EditText确实正确调整了平移,因此用户可以看到他/她正在键入的位置。 更新: 如果没有工作解决方案来调整窗口,有没有办法让WebView认为它的内容就像半屏高度更大,因此用户至少可以滚动输入可见。

Google Maps Fragment在片段内返回null

所以我有一个包含地图片段的空片段。 每当我尝试激活包含地图的片段时,我的应用程序崩溃并在此行返回空指针错误: map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)) .getMap(); 完整错误消息: java.lang.NullPointerException: Attempt to invoke virtual method ‘com.google.android.gms.maps.GoogleMap com.google.android.gms.maps.MapFragment.getMap()’ on a null object reference at com.collusion.serviceassistant.ReturnVisitDetails.onViewCreated(ReturnVisitDetails.java:39) at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:904) at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062) at android.app.BackStackRecord.run(BackStackRecord.java:684) at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447) at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443) at android.os.Handler.handleCallback(Handler.java:733) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5001) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 这是我的片段代码: import android.app.Activity; import android.app.Dialog; import android.net.Uri; […]

现在不推荐使用TabActivity,使用Fragments创建选项卡

我正在创建一个应用程序,它在屏幕底部有五个选项卡,每个选项卡打开一个不同的Activity。 我的选项卡活动扩展了我刚刚阅读的TabActivity,我不应该使用Fragments。 如何更改我的应用程序以使用Fragments? 我已经阅读了android.developer.com上的信息,但我仍然不知道如何做到这一点。

FragmentManager IllegalStateException:没有主机

更新 :当我放入nullcheks(片段!= null,getActivity()!= null)时,崩溃消失了。 我的应用程序使用ViewPager (屏幕外限制5),并使用getSupportFragmentManager()初始化FragmentStatePagerAdapter 。 每个页面都有自己的片段和后台堆栈。 应用程序在启动时崩溃。 问题仅出现在preLollipop设备和仿真器上。 使用最新支持lbrary(尝试24.0.0也 – 相同结果)Stacktrace: java.lang.IllegalStateException:在android.support的android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1267)的android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1267)没有主机.v4.app.FragmentManagerImpl.dispatchCreate(FragmentManager.java:2138)位于android.support.v4.app.Fragment.onCreate(Fragment.java:1254)的android.support.v4.app.Fragment.performCreate(Fragment.java) :2062)在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1051)的android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1286)android.support.v4.app上的android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1051)。在Android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:637)的android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1632)上的BackStackRecord.run(BackStackRecord.java:758) android.support.v4.view.ViewPager.pop上的.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:166) ulate(ViewPager.java:1237)位于android.sview的android.support.v4.view.ViewPager.populate(ViewPager.java:1085)android.sview.v4上的android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1611) .View.measure(View.java:16497)位于android.widget.Linout.measureVertical的android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)上的android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) LinearLayout.java:695)在android.view.measure.View.measure(View.java:16497)的android.widget.Linear.onMeasure(LinearLayout.java:588)android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) )在android.widget.FreeLayout.onMeasure(FrameLayout.java:310)的android.view.measure.View.measure(View.java:16497)android.widget.RelativeLayout.measureChildHorizo​​ntal(RelativeLayout.java:719)android.widget .AlativeLayout.onMeasure(RelativeLayout.java:455)在Android.widge上的android.view.vision.measure(View.java:16497)android.view.measureGroup.measureChildMargins(ViewGroup.java:5125) t.FrameLayout.onMeasure(FrameLayout.java:310)位于android.view.view.measure(View.java:16497)android.view的android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:135) .ViewGroup.measureChildWithMargins(ViewGroup.java:5125)位于android.view.measure.View.measure(View.java:16497)的android.view.FreeLayout.onMeasure(FrameLayout.java:310),位于android.view.ViewGroup.measureChildWithMargins( ViewGroup.java:5125)在android.view.measure.View.measure(View.java:16497)的android.widget.FrameLayout.onMeasure(FrameLayout.java:310)android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)在android.widget.LinearLayout.measureChildBayforeLayout(LinearLayout.java:1404)android.widget.Linear.measureVertical(LinearLayout.java:695)android.widget.Linear.onMeasure(LinearLayout.java:588)android.view .View.measure(View.java:16497)位于android.widget.FrameLayout.onMeasure(FrameLayout.java:310)的android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) 在com.android.internal.policy.impl.PhoneWindow $ DecorView.onMeasure(PhoneWindow.java:2291)的android.view.View.measure(View.java:16497)android.view.ViewRootImpl.performMeasure(ViewRootImpl.java) :1912)在android.view.ViewRootImpl.measureHversy中的android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1109),在android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:996)的android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1291) .view.ViewRootImpl $ TraversalRunnable.run(ViewRootImpl.java:5600)在android.view.Choreographer $ CallbackRecord.run(Choreographer.java:761)的android.view.Choreographer.doCallbacks(Choreographer.java:574)。在android.view.Handler的android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:747)的android.O. .dispatchMessage(Handler.java:95)在android.os.Looper.loop(Looper.java:136)

自动片段还原的工作原理

使用FragmentActivity它会自动恢复片段状态并重新创建所有片段。 我知道这主要是在onSaveInstanceState保存状态,然后在activity的onCreate恢复。 看一下代码,我看到所有片段都被重新创建(或者只有在retainInstance为真时才附加)并添加到FragmentManager但我不清楚它们以哪种方式添加到视图中,因为视图不是自动恢复。 我最初的问题是我得到了一些类似于其他问题的片段的重复。 我在onCreate上: Fragment f = fm.findFragmentByTag(tagName); if(f==null) { f = createFragment(); fm.beginTransaction().add(R.id.myContainer,f,tagName).commit(); } else { //Nothing it’s on the view } 现在它可以工作,但我仍然不完全理解它是如何工作的。 我的怀疑是: 在哪一刻以及片段如何附加到视图? 我已经尝试过片段恢复是在onCreate of FragmentActivity 。 但是如果我之后调用setContentView ,片段如何附加到视图? 我可以在不覆盖onSaveInstanceState情况下阻止片段重新创建吗? 因为由于具有不同数量的片段的不同方向布局,我的初衷是仅重新创建标记为保留的一个状态片段,而不恢复未标记为保留的其他视图片段。

Android – 打开和关闭屏幕时,覆盖在全屏video最后一帧上的视图无法正确重绘

我有一个以纵向模式播放的video。 在video结束时,我需要显示一些视图。 这到目前为止工作正常。 但是,我有一个问题,即在关闭屏幕,然后重新打开,然后解锁屏幕后返回活动时,video最后一帧的视图无法正确重绘。 我所观察到的是,当屏幕重新亮起并且我解锁时。 我的video和图像首先在全屏模式之外呈现(状态栏仍然显示),然后屏幕将进入全屏模式,将所有视图向上移动并导致伪像。 看起来这些视图在渲染后通过向全屏的过渡转移到视图边界之外。 我真的很难过如何防止这种情况发生。 这是github上的沙箱项目,以避免使这个post充满代码。 该项目的基本设置如下: 片段活动在其布局上有video视图和按钮视图。 然后它将一个片段添加到contentView容器中。 contentView在video播放结束前1秒内淡出。 一切顺利,问题在于打开和关闭屏幕电源后返回应用程序。 此外,有时video将完全退出,使视图位于黑色背景上。 提前感谢您提供的任何帮助。 这是当您关闭,重新打开和解锁屏幕时发生的伪像。 请注意,我必须拍一张照片。 在DDMS上,屏幕截图工具可以正确查看图像。

将ListFragment的主题修改为与活动不同?

基本上我想在清单中设置我的活动主题如下: android:theme=”@android:style/Theme.Translucent.NoTitleBar” 我希望我的活动加载一个主题为Theme.Holo.Dialog的ListFragment(以我自己的风格定义),但我不能只在我的片段中调用setStyle(….),如果它是一个DialogFragment。 我相信我应该能够使用ContextThemeWrapper,但是我无法理解我需要进行的调用。 到目前为止,在我的onCreateView中,我有: @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { LayoutInflater newInflater = inflater.cloneInContext(new ContextThemeWrapper(getActivity(), R.style.DialogThemeSelector)); View inflatedView = newInflater.inflate(R.layout.favourites_print, container, false); ….. 但这不起作用。 提前致谢。 彼得。 * 编辑*发布方式:

Actionbar项目正在重复

我的应用程序中有Action Bar。 我正在使用menu.xml添加操作项。 我正在使用action bar-compat作为我的支持库。 我观察到一个奇怪的问题,我的行动项目正在重复。 当我的设备闲置或与其他应用程序一起工作时,我会随机发现此问题。 请在下面find屏幕截图和我的代码: private LoginWebActivity mContext; private final String TAG = “LoginFragment”; // for metrics private String mPageNameSignIn = “signin”; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mView = inflater.inflate(R.layout.webview, container, false); return mView; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mContext = (LoginWebActivity) getActivity(); initFragment(); […]

如何在EditText和Soft Keyboard之间添加边距?

我想在EditText和Soft Keyboard之间添加10dp的边距。 这是我的XML: 这是我的onCreate() : getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); messageText.setOnTouchListener(new OnTouchListener(){ @Override public boolean onTouch(View v, MotionEvent event) { ((Swipe)getActivity()).getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_UNSPECIFIED); return false; }}); 我正在使用viewpager和全屏主题。 以下EditText位于我的第3个片段中。 我用过android:windowSoftInputMode=”adjustResize|adjustPan”和android:windowSoftInputMode=”adjustResize” ,但什么都没发生。