标签: fragmentmanager

在Fragment和FragmentStatePagerAdapter中使用ViewPager的片段导致异常(带有完整示例)

我有一个带有ViewPager的简单片段.

我正在使用最新的支持库,v4 rev18!

如果我第一次显示子片段,一切正常,如果我返回并再次显示它,应用程序崩溃时出现以下异常:

我有一个完整的例子显示,当发生以下异常时:

java.lang.NullPointerException
at android.support.v4.app.FragmentManagerImpl.getFragment(FragmentManager.java:569)
at android.support.v4.app.FragmentStatePagerAdapter.restoreState(FragmentStatePagerAdapter.java:211)
at android.support.v4.view.ViewPager.onRestoreInstanceState(ViewPager.java:1281)
at android.view.View.dispatchRestoreInstanceState(View.java:12043)
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2688)
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2694)
at android.view.View.restoreHierarchyState(View.java:12021)
at android.support.v4.app.Fragment.restoreViewState(Fragment.java:425)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:949)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1460)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:440)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4800)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:798)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:565)
at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)

我能够以其他方式在子片段中使用ViewPager,但如果我手动添加/删除子片段并在子片段中使用FragmentStatePagerAdapter,我就无法使用它...

以下示例应该可以工作,但它没有...我已经添加了一些解决了一些问题的代码,但它并没有解决所有问题......

import java.lang.reflect.Field;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.TextView; …
Run Code Online (Sandbox Code Playgroud)

android android-fragments android-viewpager android-support-library fragmentmanager

9
推荐指数
1
解决办法
9518
查看次数

Android:在内部膨胀 RecyclerView 时,如何防止 Fragment 事务上的延迟或动画跳过?

我正在处理一些片段,但是从一个片段切换到另一个片段时的过渡动画非常滞后,有时甚至会跳过整个动画(我已经读过,有时这是片段性能不佳的结果)。

非常有趣的是,我在该片段中的所有数据获取和计算都是使用设置在计算线程上的协程完全异步完成的。包含数据的数组列表甚至不长或有很多参数。我在 UI 上做的唯一一件事就是在 RecyclerView Adapter 和 notifyDataSetChanged() 上设置最终列表 -> 就是这样!所以我的结论是 ViewHolder 膨胀本身就是导致滞后的原因。ViewHolders 的布局 XML 也非常精简(一个可绘制资源和三个字符串)。

在片段事务方面,我将当前片段替换为 FrameLayout 中的新片段,并使用一组自定义的 XML 对象动画器进行提交。

我已经看到一些答案说我应该将适配器上的项目设置延迟大约 2 秒钟,但是见鬼,最终用户在该片段中导航并在白屏上等待 2 秒钟之前看起来真的很糟糕数据突然出现。我想要一个平滑的 60fps 过渡到新片段,数据已经显示。

这件事在Android上甚至可能吗?我不是苹果迷,但就动画的流畅度和流畅度而言,iOS 设备在这个主题上破坏了 Android 的混乱局面。

我需要任何类型的建议甚至示例来向我展示如何解决此问题。

谢谢!

animation android fragment fragmenttransaction fragmentmanager

9
推荐指数
1
解决办法
3642
查看次数

Android:remove()Fragment - > add()new同一个类的片段 - > onCreateView和onActivityCreated没有被调用?

我正在破坏以编程方式创建的片段:

getFragmentManager().beginTransaction().remove(getFragmentManager().findFragmentById(R.id.test)).commit();
Run Code Online (Sandbox Code Playgroud)

这是在xml文件中确定的,如下所示:

<LinearLayout
    android:id="@+id/test"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

如果我然后在mainactivity中再次从同一个类创建一个片段:

getSupportFragmentManager().beginTransaction()
            .add(R.id.result_bar, testinstance)
            .commit();
Run Code Online (Sandbox Code Playgroud)

然后onCreate似乎没有被再次调用(片段只是空的).我在这做错了什么?谢谢.

java android android-fragments fragmentmanager

8
推荐指数
1
解决办法
4002
查看次数

没有支持库的BetterPickers

我正在使用https://github.com/derekbrameyer/android-betterpickers为我的应用程序使用时间和日期选择器.但是,我的应用程序不需要支持库,在将FragmentManager设置为Time-和DatePickerBuilder时,我似乎需要SupportFragmentManager:/有没有办法避免支持库?

android datepicker timepicker android-support-library fragmentmanager

8
推荐指数
1
解决办法
668
查看次数

android.support.v4.app.FragmentManager或android.app.FragmentManager?

我正在学习Android开发.我陷入了一件非常容易的事情.

我正在使用一个Activity,2个片段和1个界面创建一个App.

android:minSdkVersion="11"
android:targetSdkVersion="19
Run Code Online (Sandbox Code Playgroud)

所以在主要活动中我试图使用管理器创建对Fragment B的引用.我被困在这里,因为Eclispse告诉我改变一些事情(见下文):

我的意图:`

@Override
    public void respond(int i) {
        // TODO Auto-generated method stub

    FragmentManager manager =getFragmentManager();
    FragmentB f2= (FragmentB) manager.findFragmentById(R.id.fragment2);

}`
Run Code Online (Sandbox Code Playgroud)

如果我这样做,我会收到错误消息并需要执行一些更改.更改后,代码看起来像这样(我仍然无法访问FragmentB):

    @Override
public void respond(int i) {
    // TODO Auto-generated method stub

    android.app.FragmentManager manager =getFragmentManager();
    android.app.Fragment f2=  manager.findFragmentById(R.id.fragment2);

}
Run Code Online (Sandbox Code Playgroud)

有关额外的详细信息,我将在此处放置Activity的导入标题:

  package com.example.modular_ui;

import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.os.Build;

public class MainActivity extends Activity implements Communicator{....
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?整个support.v4 …

android fragment android-fragments fragmentmanager

8
推荐指数
3
解决办法
3万
查看次数

FragmentTransaction.remove(Fragment)之后FragmentManager.getFragmens().size()不会减少

经过一段时间搜索我的NPE的原因后,我注意到尽管FragmentTransaction.remove(Fragment)确实删除了Fragment,但FragmentManager.getFragments()返回的List的大小仍然相同.此屏幕截图显示了删除片段后此方法返回的内容:

https://www.dropbox.com/s/s3bt1p7i71a5kgx/erro%20fm.PNG

该列表有3个片段,为什么大小仍为4?

android android-fragments fragmenttransaction fragmentmanager

8
推荐指数
0
解决办法
735
查看次数

Android片段实现问题

这是我的片段的xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:tools="http://schemas.android.com/tools"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:context="com.thenewjonathan.foodtracker.fragments.FoodItemDisplay"
    >
<TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="50dp"
        android:textStyle="bold"
        android:text="blank"
        android:id="@+id/foodItemNameView"
        android:gravity="center"
        android:layout_gravity="top|left|center"
        android:textAlignment="center"/>
<ImageView
        android:contentDescription="@string/foodPicture"
        android:layout_width="241dp"
        android:layout_height="241dp"
        android:layout_gravity="left|center_vertical"
        android:background="@color/material_blue_grey_800"
        android:layout_below="@id/foodItemNameView"
        android:id="@+id/foodPic"
        />
<RelativeLayout
        android:layout_width="140dp"
        android:layout_height="241dp"
        android:layout_alignParentRight="true"
        android:layout_below="@id/foodItemNameView"
        android:layout_gravity="end|center_vertical"
        android:gravity="center"
        android:id="@+id/checkBoxGroup"
        >
    <CheckBox
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Monday"
            android:id="@+id/mondayBox"
            android:layout_alignParentTop="true"
            android:layout_alignParentStart="true"/>
    <CheckBox
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Tuesday"
            android:id="@+id/tuesdayBox"
            android:layout_below="@id/mondayBox"
            android:layout_alignParentStart="true"/>
    <CheckBox
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Wednesday"
            android:id="@+id/wednesdayBox"
            android:layout_below="@id/tuesdayBox"
            android:layout_alignParentStart="true"/>
    <CheckBox
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Thursday"
            android:id="@+id/thursdayBox"
            android:layout_below="@id/wednesdayBox"
            android:layout_alignParentStart="true"/>
    <CheckBox
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Friday"
            android:id="@+id/fridayBox"
            android:layout_below="@id/thursdayBox"
            android:layout_alignParentStart="true"/>
    <CheckBox
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Saturday"
            android:id="@+id/saturdayBox"
            android:layout_below="@id/fridayBox"
            android:layout_alignParentStart="true"/>
    <CheckBox
            android:layout_width="wrap_content" …
Run Code Online (Sandbox Code Playgroud)

java android intellij-idea android-fragments fragmentmanager

8
推荐指数
1
解决办法
176
查看次数

对于片段A,findFragmentByTag为null,如果片段B上为setRetain(true)

我的问题涉及托管三个支持片段的活动.一个是正​​常的程序片段(让我们称之为家庭片段).一个是在设备定向时添加在主片段顶部的肖像片段,一个是"无头"的,以便无论配置如何变化都能继续执行异步任务.很简单,我正在研究这个很好的例子.

public class HeadlessCustomerDetailFetchFragment extends Fragment{
private RequestCustomerDetails mRequest;
private AsyncFetchCustomerDetails mAsyncFetchCustomerDetails;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRetainInstance(true);

    mRequest = (RequestCustomerDetails)getActivity();
}

public void startFetching(String scannedBarcode) {
    if(mAsyncFetchCustomerDetails != null && mAsyncFetchCustomerDetails.getStatus() == AsyncTask.Status.RUNNING) return;

    if(mAsyncFetchCustomerDetails == null || mAsyncFetchCustomerDetails.getStatus() == AsyncTask.Status.FINISHED)
        mAsyncFetchCustomerDetails = new AsyncFetchCustomerDetails(getActivity(), mRequest, mPartner, scannedBarcode);
}

public void stopFetching() {
    if(mAsyncFetchCustomerDetails != null && mAsyncFetchCustomerDetails.getStatus() != AsyncTask.Status.RUNNING) return;
    mAsyncFetchCustomerDetails.cancel(true);
}
Run Code Online (Sandbox Code Playgroud)

}

在我的活动的onCreate()中,我根据需要创建并添加无头片段.

 mHeadlessCustomerDetailFetchFragment = (HeadlessCustomerDetailFetchFragment)getSupportFragmentManager()
            .findFragmentByTag(HeadlessCustomerDetailFetchFragment.class.getSimpleName());

if(mHeadlessCustomerDetailFetchFragment == null) {
         mHeadlessCustomerDetailFetchFragment = …
Run Code Online (Sandbox Code Playgroud)

android android-configchanges android-fragments fragmentmanager

8
推荐指数
1
解决办法
507
查看次数

我应该用什么来代替 getWidth() 和 getHeight() 来知道什么时候宽度更大,什么时候高度更大

import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Display;
import android.view.WindowManager;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        FragmentManager fm=getFragmentManager();
        FragmentTransaction ft= fm.beginTransaction();


        WindowManager wm= getWindowManager();
        Display d=wm.getDefaultDisplay();

        if (d.getWidth()>d.getHeight())
        {
            Fragment1 f1 = new Fragment1();
            ft.replace(android.R.id.content, f1);
        }
        else
        {
            Fragment2 f2 = new Fragment2();
            ft.replace(android.R.id.content, f2);
        }
    ft.commit();
    }
}
Run Code Online (Sandbox Code Playgroud)

我试图使用Android的碎片和希望显示fragment1在显示器的宽度大于显示器的高度和更大fragment2时显示的高度比显示器的宽度,但使用时更大getWidth()getHeight()机器人工作室是说,这些方法depricated。那么如何知道什么时候宽度更大,什么时候高度更大呢?

android window-managers fragment fragmentmanager display

8
推荐指数
1
解决办法
1110
查看次数

切换片段时跳跃滚动

在 ScrollView 中,我在两个不同高度的片段之间动态切换。不幸的是,这会导致跳跃。人们可以在以下动画中看到它:

  1. 我正在向下滚动,直到到达“显示黄色”按钮。
  2. 按“显示黄色”会用一个微小的黄色片段替换一个巨大的蓝色片段。发生这种情况时,两个按钮都会跳到屏幕的末尾。

当切换到黄色片段时,我希望两个按钮都保持在相同的位置。那怎么办呢?

卷

源代码分别位于https://github.com/wondering639/stack-dynamiccontent https://github.com/wondering639/stack-dynamiccontent.git

相关代码片段:

活动_main.xml

<?xml version="1.0" encoding="utf-8"?>

<androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/myScrollView"
android:layout_width="match_parent"
android:layout_height="match_parent">

<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="0dp"
        android:layout_height="800dp"
        android:background="@color/colorAccent"
        android:text="@string/long_text"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/button_fragment1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginLeft="16dp"
        android:text="show blue"
        app:layout_constraintEnd_toStartOf="@+id/button_fragment2"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView" />

    <Button
        android:id="@+id/button_fragment2"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginEnd="16dp"
        android:layout_marginRight="16dp"
        android:text="show yellow"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toEndOf="@+id/button_fragment1"
        app:layout_constraintTop_toBottomOf="@+id/textView" />

    <FrameLayout
        android:id="@+id/fragment_container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toBottomOf="@+id/button_fragment2">

    </FrameLayout>

</androidx.constraintlayout.widget.ConstraintLayout>
Run Code Online (Sandbox Code Playgroud)

主活动.kt

package com.example.dynamiccontent

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button

class MainActivity : …
Run Code Online (Sandbox Code Playgroud)

android android-layout android-fragments android-scrollview fragmentmanager

8
推荐指数
1
解决办法
1950
查看次数