java - Fragment中TextView的空对象引用

标签 java android android-fragments textview

我有两个 fragment 和一个主要 Activity 。第一个 fragment FriendsFragment(扩展 ListFragment)显示在屏幕上,当用户单击某个项目时,主 Activity 将 FriendsFragment 替换为 FeedFragment,然后调用 FeedFragment 中的方法来更新 textView。

即使我使用 findViewById 方法实例化,我还是收到一条错误消息,FeedFragment 类中的 textView 对象为 null。

我查看了相关问题并尝试了解决方案,但没有任何效果。我尝试过 getView().findViewById(R.id.feed_view)getActivity().findViewById(R.id.feed_view),并且我尝试过将它们放入 onActivityCreated()onCreateView()

唯一有效的是在 onActivityCreated() 中编写此代码:

text = getView().findViewById(R.id.feed_view); 
text.setText("some string"); 

但这不是我想要的

FeedFragments.java

public class FeedFragment extends Fragment {
    private static String TAG = "Feed Fragment";
    private TextView text;

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        Log.i(TAG, "Entered FeedFragment.java onActivityCreated()");
        super.onActivityCreated(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    Log.i(TAG, "Entered FeedFragment.java onCreateView()");
    View v = inflater.inflate(R.layout.fragment_feed, container,false);;
    text = v.findViewById(R.id.feed_view);
    return v;
}

public void updateDisplay(int position)
{
    Log.i(TAG, "FeedFragment.java: updateDisplay()");
    text.setText(position);
}

MainActivity.java

// previously declared feedFragment: feedFragment = new FeedFragment(); 
public void onItemSelected(int position)
{
    Log.i(TAG, "Entered onItemSelected(" + position + ")");
    fragManager = getFragmentManager();
    FragmentTransaction fragTransaction = fragManager.beginTransaction();
    fragTransaction.replace(R.id.fragment_container, feedFragment, "feed_fragment");
    fragTransaction.addToBackStack(null);
    fragTransaction.commit();

    feedFragment.updateDisplay(position);
}

fragment_feed.xml

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >

    <TextView
        android:id="@+id/feed_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/greeting" />

</ScrollView>

activity_main.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />

最佳答案

onViewcreated() 在 updateDisplay() 之后被调用,因为系统不会立即运行它。

您需要在创建 feedFragment 时将一个值传递给它,并将其存储在一个包中,并在系统运行 fragment 内部代码后检索它。

解决方法是这样的:

当你实例化 feedFragment 时,你会这样做:

feedFragment = FeedFragment.newInstance(position)

在 FeedFragment 类中,您应该有一个静态代码:

private static final String ARG_PARAM1 = "param1";

public static FeedFragment newInstance(int param1) {
    FeedFragment fragment = new FeedFragment();
    Bundle args = new Bundle();
    args.putInt(ARG_PARAM1, param1);
    fragment.setArguments(args);
    return fragment;
}

和非静态代码:

private int mParam1;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        mParam1 = getArguments().getInt(ARG_PARAM1);
    }
} 

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    Log.i(TAG, "Entered FeedFragment.java onCreateView()");
    View v = inflater.inflate(R.layout.fragment_feed, container,false);;
    text = v.findViewById(R.id.feed_view);
    text.setText(String.valueOf(mParam1));
    return v;
}

我将 mParam1 包装在 String.valueOf() 中,因为当您将整数传递给 setText 时,它认为您尝试使用 Strings.xml 资源而不是您选择的数字。

我还使用了非常通用的变量名称。请将它们更改为有意义的内容,以便您的代码有意义。

关于java - Fragment中TextView的空对象引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56387044/

相关文章:

java - 寻找唯一的数字

java - 由 MaterialList 的 : java. lang.ClassNotFoundException 引起

java - Android - 使用参数从数据库中过滤数据

java - 以编程方式将按钮添加到 fragment

select - GT.M 的 JavaM API - SELECT 支持

java - 自定义 Java 类与映射的速度

java - 我如何使用一个根上下文创建两个 AbstractAnnotationConfigDispatcherServletInitializer?

Android SQLite 查询连续文本?

java - 在 Fragment 中使用 ListActivity

c# - 为什么关闭的 Android Activity 似乎保留对象?