【问题标题】:Null Object that is a child of a Fragment作为 Fragment 的子级的 Null 对象
【发布时间】:2013-08-07 00:38:13
【问题描述】:

我有一个Fragment,它是ViewPager 的一部分。在这个Fragment 我有一个ViewGroup 孩子。现在,为什么在实例化我的ViewPageradapter 之后,在我的MainActivityonCreate() 中,我的Container 得到null

这是我的onCreate()

private MyAdapter mAdapter;
private ViewPager mPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mAdapter = new MyAdapter(getSupportFragmentManager());

    mPager = (ViewPager) findViewById(R.id.pager);
    mPager.setAdapter(mAdapter);

    mContainerView = (ViewGroup) findViewById(R.id.container);
    //Here mContainerView is already null
    ...
}

这是Fragment,它是包含mContainerViewViewPager的一部分

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/content_frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

<ScrollView android:layout_width="match_parent"
    android:layout_height="match_parent">
    <!-- This is my ViewGroup -->
   <LinearLayout android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:showDividers="middle"
        android:divider="?android:dividerHorizontal"
        android:animateLayoutChanges="true"
        android:paddingLeft="16dp"
        android:paddingRight="16dp" />

</ScrollView>

<TextView android:id="@android:id/empty"
    style="?android:textAppearanceSmall"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:padding="32dp"
    android:text="@string/message_empty_layout_changes"
    android:textColor="?android:textColorSecondary" />

</FrameLayout>

【问题讨论】:

    标签: android android-layout android-fragments android-viewpager viewgroup


    【解决方案1】:

    如果我正确阅读了您的问题,您正在尝试使用ActivityfindViewById() 方法访问FragmentView(和孩子)。这不应该起作用,因为Fragment 膨胀了它自己的布局并且Fragments 不是传统的Views

    如果您知道 Fragment 已实例化并且可以检索它,则可以使用

    获取 ViewGroup 的实例
    yourFragment#getView().findViewById()
    

    如果没有,您可以使用接受ViewGroup 作为参数的方法来创建Activity 实现的接口。然后在 Fragment 的 onCreateView() 中,让 Fragment 将 ViewGroup 传递给接口。您可以直接投射到您的Activity,但界面更简洁。

    例如

    public class Fragment {
    
     public interface ViewGroupCreateListener{
    
         public void onViewGroupCreated (ViewGroup v);
     }
    
     private ViewGroupCreateListener listener;
    
     public void onAttach (Activity a){
         super.onAttach (a);
         listener = (ViewGroupCreateListener) a;
     }
    
    public View onCreateView (/*all its arguments here*/){
        View v = inflater.inflate (R.layout.your_layout);
        ViewGroup group = v.findViewById (R.id.container);
        listener.onViewGroupCreated(group);
    
        return v;
     }
    

    }

    您的Activity 看起来像:

    public class MainActivity extends Activity implements ViewGroupCreateListener, OtherInterface1, OtherInterface2{
    
      private ViewGroup mViewGroup;
    
    
      public void onViewGroupCreated (ViewGroup v){
         mViewGroup = v;
      }
    }
    

    这很好,因为如果寻呼机重新实例化 Fragment,Activity 仍然会获得 ViewGroup 的有效实例。

    或者,如果取决于您实际尝试使用此ViewGroup 实现的目标,您可能能够在Fragment 本身内部进行此处理。

    【讨论】:

    • 感谢您的回答。我无法使用您显示的第一个选项获得 ViewGroup 的实例。该应用程序一开始就给我带来了 NPE。现在,第二个选项听起来不错。但是,我已经在我的主 Activity 中实现了另一个接口。这是我的gist;如果你不介意去看看。我的问题是我正在检索用户从对话框中选择的列表。之后,我想在提到的 Fragment 中添加一个视图,但我在 Fragment1 的第 48 行中的 mContainerView 为空。我该怎么做才能以正确的方式实例化它?
    • 我尝试设置界面,但它把我扔了08-06 21:48:42.018: E/AndroidRuntime(12352): FATAL EXCEPTION: main 08-06 21:48:42.018: E/AndroidRuntime(12352): java.lang.ClassCastException: com.foodbuilder.MainActivity cannot be cast to com.foodbuilder.Fragment1$ViewGroupCreateListener
    • @LuisLavieri gist 中的堆栈跟踪与代码不匹配,没有line 67。关于其他一切:1)一个类可以实现的接口数量没有限制。 2)对于对话框逻辑,如果片段不应该启动对话框,那么会这样做:对话框更新,将数据传递给活动,活动更新片段(几乎就像你现在一样)。如果您在我的回答中实现了接口,它应该可以按预期工作,并且您避免使用 static 变量。
    • 你还需要实现MainActivity中的接口。可以实现多个接口,只需用逗号分隔(见后编辑)
    • 正确!我只是按照您在回答中的建议在View 之后实例化了ViewGroup group,并在您在我的要点中看到的update() 中使用它。现在,回到我的帖子的问题,我的问题是我无法理解在实例化ViewGroup 之前我必须inflate 我的View。你帮我解决了这个问题。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多