标签: android-fragments

片段中的findViewById

我试图在片段中创建一个ImageView,它将引用我在片段的XML中创建的ImageView元素.但是,该findViewById方法仅在扩展Activity类时才有效.无论如何,我还可以在片段中使用它吗?

public class TestClass extends Fragment {
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        ImageView imageView = (ImageView)findViewById(R.id.my_image);
        return inflater.inflate(R.layout.testclassfragment, container, false);
    }
}
Run Code Online (Sandbox Code Playgroud)

findViewById方法有一个错误,表明该方法是未定义的.

android android-imageview android-fragments findviewbyid

975
推荐指数
23
解决办法
56万
查看次数

片段中没有调用onActivityResult

托管此片段的活动onActivityResult在相机活动返回时调用.

我的片段开始一个结果的活动,其意图是发送给相机拍照.图片应用程序加载正常,拍照并返回.该onActivityResult然而,永远不会打.我设置了断点,但没有触发任何东西.一个片段可以onActivityResult吗?我想是因为它是一个提供的功能.为什么不被触发?

ImageView myImage = (ImageView)inflatedView.findViewById(R.id.image);
myImage.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View view) {
        Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(cameraIntent, 1888);
    }
});

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if( requestCode == 1888 ) {
        Bitmap photo = (Bitmap) data.getExtras().get("data");
        ((ImageView)inflatedView.findViewById(R.id.image)).setImageBitmap(photo);
    }
}
Run Code Online (Sandbox Code Playgroud)

android android-fragments android-activity

834
推荐指数
19
解决办法
37万
查看次数

困境:何时使用碎片与活动:

我知道它Activities的目的是代表我的应用程序的单个屏幕,同时Fragments设计为可重用的UI布局,其中嵌入了逻辑.

直到不久前,我开发了一个应用程序,因为它说应该开发它们.我创建了一个Activity代表我的应用程序的屏幕并使用Fragments for ViewPagerGoogle Maps.我很少创建ListFragment可以多次重用的UI或其他UI.

最近我偶然发现一个项目只包含2 Activities个是一个SettingsActivity而另一个是MainActivity.它的布局中MainActivity填充了许多隐藏的全屏UI片段,只显示了一个.在Activity逻辑FragmentTransitions中,应用程序的不同屏幕之间存在许多.

我喜欢这种方法的原因是因为应用程序使用了一个ActionBar,它保持原样并且不会随着屏幕切换动画一起移动,这就是Activity切换时发生的情况.这为这些屏幕转换提供了更流畅的感觉.

所以我想我要问的是分享你关于这个主题的当前开发方式,我知道它看起来可能看起来像一个基于意见的问题,但我把它视为一个Android设计和架构问题...不是真的基于意见的一个.

更新(01.05.2014):继来自SquareEric Burke的演示之后(我不得不说这是一个很棒的演示文稿,为Android开发人员提供了许多有用的工具.而且我与Square没有任何关系)

http://www.infoq.com/presentations/Android-Design/

根据我过去几个月的个人经验,我发现构建应用程序的最佳方法是创建一组片段,这些片段代表应用程序中的并将所有这些片段集中在一个片段中Activity.所以基本上你Activities的应用程序的数量与流量的数量相同.这样,操作栏在所有流程的屏幕上保持完整,但正在重新创建流程,这很有意义.正如埃里克伯克所说,并且我也已经意识到,尽可能少Activities地使用的哲学并不适用于所有情况,因为它在他所谓的"上帝"活动中造成混乱.

architecture android android-fragments android-activity

761
推荐指数
11
解决办法
19万
查看次数

如何确定片段何时在ViewPager中可见

问题:片段onResume()ViewPager片段实际可见之前被触发.

例如,我有2个片段与ViewPagerFragmentPagerAdapter.第二个片段仅供授权用户使用,我需要让用户在片段可见时登录(使用警告对话框).

但是ViewPager当第一个片段可见时创建第二个片段,以便缓存第二个片段,并在用户开始滑动时使其可见.

因此,onResume()事件在第二个片段变为可见之前就被触发了.这就是为什么我试图找到一个事件,当第二个片段变得可见时,它会在适当的时刻显示一个对话框.

如何才能做到这一点?

android android-fragments android-viewpager

728
推荐指数
13
解决办法
29万
查看次数

实例化新Android片段的最佳实践

我已经看到了两个在应用程序中实例化新Fragment的一般实践:

Fragment newFragment = new MyFragment();
Run Code Online (Sandbox Code Playgroud)

Fragment newFragment = MyFragment.newInstance();
Run Code Online (Sandbox Code Playgroud)

第二个选项使用静态方法newInstance(),通常包含以下方法.

public static Fragment newInstance() 
{
    MyFragment myFragment = new MyFragment();
    return myFragment;
}
Run Code Online (Sandbox Code Playgroud)

起初,我认为主要的好处是我可以重载newInstance()方法以在创建Fragment的新实例时提供灵活性 - 但我也可以通过为Fragment创建重载构造函数来实现这一点.

我错过了什么?

一种方法比另一种方法有什么好处?还是只是好习惯?

android android-fragments

677
推荐指数
7
解决办法
30万
查看次数

在片段中使用上下文

如何在片段中获取上下文?

我需要用我的数据库其构造函数采用的背景下,但getApplicationContext()FragmentClass.this没有工作,所以我能做些什么?

数据库构造函数

public Database(Context ctx)
{
    this.context = ctx;
    DBHelper = new DatabaseHelper(context);
}
Run Code Online (Sandbox Code Playgroud)

java android android-context android-fragments

645
推荐指数
12
解决办法
46万
查看次数

ViewPager和片段 - 什么是存储片段状态的正确方法?

片段似乎非常适合将UI逻辑分离为某些模块.但随着ViewPager它的生命周期对我来说仍然是迷雾.因此迫切需要大师的想法!

编辑

见下面的哑解决方案;-)

范围

主要活动有ViewPager碎片.这些片段可以为其他(子域)活动实现一些不同的逻辑,因此片段的数据通过活动内部的回调接口填充.第一次发布时一切正常,但是!...

问题

当重新创建活动时(例如,在方向改变时),那么ViewPager碎片也是如此.代码(你会在下面找到)说每次创建活动时我尝试创建一个ViewPager与片段相同的新片段适配器(也许这就是问题)但FragmentManager已经将所有这些片段存储在某个地方(其中?)和为那些人启动娱乐机制.因此,重新启动机制使用我的回调接口调用来调用"旧"片段的onAttach,onCreateView等,以通过Activity的实现方法启动数据.但是这个方法指向通过Activity的onCreate方法创建的新创建的片段.

问题

也许我使用了错误的模式,但即便是Android 3 Pro也没有太多关于它的内容.所以,给我一两拳,并指出如何以正确的方式做到这一点.非常感谢!

主要活动

public class DashboardActivity extends BasePagerActivity implements OnMessageListActionListener {

private MessagesFragment mMessagesFragment;

@Override
protected void onCreate(Bundle savedInstanceState) {
    Logger.d("Dash onCreate");
    super.onCreate(savedInstanceState);

    setContentView(R.layout.viewpager_container);
    new DefaultToolbar(this);

    // create fragments to use
    mMessagesFragment = new MessagesFragment();
    mStreamsFragment = new StreamsFragment();

    // set titles and fragments for view pager
    Map<String, Fragment> screens = new LinkedHashMap<String, Fragment>();
    screens.put(getApplicationContext().getString(R.string.dashboard_title_dumb), new DumbFragment());
    screens.put(getApplicationContext().getString(R.string.dashboard_title_messages), mMessagesFragment);

    // …
Run Code Online (Sandbox Code Playgroud)

android design-patterns android-fragments android-viewpager

483
推荐指数
5
解决办法
22万
查看次数

IllegalStateException:使用ViewPager在onSaveInstanceState之后无法执行此操作

我从我的应用程序中获取用户报告,提供以下异常:

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1109)
at android.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:399)
at android.app.Activity.onBackPressed(Activity.java:2066)
at android.app.Activity.onKeyUp(Activity.java:2044)
at android.view.KeyEvent.dispatch(KeyEvent.java:2529)
at android.app.Activity.dispatchKeyEvent(Activity.java:2274)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1803)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:1855)
at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1277)
at android.app.Activity.dispatchKeyEvent(Activity.java:2269)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1803)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.widget.TabHost.dispatchKeyEvent(TabHost.java:297)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:1855)
at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1277)
at android.app.Activity.dispatchKeyEvent(Activity.java:2269)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1803)
at android.view.ViewRoot.deliverKeyEventPostIme(ViewRoot.java:2880)
at android.view.ViewRoot.handleFinishedEvent(ViewRoot.java:2853)
at android.view.ViewRoot.handleMessage(ViewRoot.java:2028)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:132)
at android.app.ActivityThread.main(ActivityThread.java:4028)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:491)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844) …
Run Code Online (Sandbox Code Playgroud)

android illegalstateexception android-fragments android-viewpager fragmenttransaction

472
推荐指数
12
解决办法
30万
查看次数

一劳永逸,如何在后台堆栈中正确保存Fragments的实例状态?

我在SO上发现了许多类似问题的实例,但遗憾的是没有答案符合我的要求.

我有纵向和横向的不同布局,我正在使用后台堆栈,这两个都阻止我setRetainState()使用配置更改例程使用和技巧.

我在TextViews中向用户显示某些信息,这些信息不会保存在默认处理程序中.仅使用活动编写我的应用程序时,以下工作正常:

TextView vstup;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.whatever);
    vstup = (TextView)findViewById(R.id.whatever);
    /* (...) */
}

@Override
public void onSaveInstanceState(Bundle state) {
    super.onSaveInstanceState(state);
    state.putCharSequence(App.VSTUP, vstup.getText());
}

@Override
public void onRestoreInstanceState(Bundle state) {
    super.onRestoreInstanceState(state);
    vstup.setText(state.getCharSequence(App.VSTUP));
}
Run Code Online (Sandbox Code Playgroud)

使用Fragments,这仅适用于非常特定的情况.具体来说,可怕的破坏是替换片段,将其放入后栈,然后在显示新片段时旋转屏幕.根据我的理解,旧片段onSaveInstanceState()在被替换时没有接收到调用但是以某种方式Activity与之相关联,并且此方法稍后在其View不再存在时调用,因此将我TextView的任何结果查找为a NullPointerException.

另外,我发现保留对我的引用对于s TextViews来说并不是一个好主意Fragment,即使它是正常Activity的.在这种情况下,onSaveInstanceState()实际上保存状态但是如果我在隐藏片段时旋转屏幕两次,则问题会重新出现,因为它onCreateView()不会在新实例中被调用.

我想把状态保存onDestroyView()到某个Bundle类型的类成员元素中(它实际上是更多的数据,而不仅仅是一个TextView)并保存,onSaveInstanceState()但还有其他缺点.首先,如果该片段当前显示,调用两个函数的顺序是相反的,所以我需要考虑两种不同的情况.必须有一个更清洁,更正确的解决方案!

android android-fragments

465
推荐指数
5
解决办法
27万
查看次数

为什么片段,何时使用片段而不是活动?

在Android API 11+中,Google发布了一个名为的新类Fragment.

在视频中,谷歌建议尽可能(link1,link2),我们应该使用片段而不是活动,但他们没有解释确切原因.

片段的目的是什么?它们的一些可能的用途(除了一些可以通过简单的视图/布局轻松实现的UI示例)?

我的问题是片段:

  1. 使用片段的目的是什么?
  2. 与使用活动/视图/布局相比,使用片段有哪些优缺点?

奖金问题:

  1. 你能为片段提供一些非常有趣的用途吗?谷歌在他们的视频中没有提到的事情?
  2. 片段与包含片段的活动之间进行通信的最佳方式是什么?
  3. 使用片段时要记住哪些最重要的事情?您的经验提示和警告?

android android-layout android-fragments android-3.0-honeycomb android-activity

451
推荐指数
7
解决办法
16万
查看次数