2

我有一个简单的 Android 应用程序。布局文件夹显示一个activity_main.xml 文件和一个fragment_main.xml 文件。在该 fragment.xml 文件中,我放置了一个名为 buttonTest 的按钮。

<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"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="com.snapvest.thunderbird.app.MainActivity$PlaceholderFragment">

<LinearLayout
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_alignParentBottom="true"
    android:layout_alignParentRight="true">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="TEST"
        android:id="@+id/buttonTest"
        android:layout_gravity="center_horizontal" />
</LinearLayout>

在 MainActivity.java 文件中,我试图访问该 buttonTest。

public class MainActivity extends Activity {

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

    if (savedInstanceState == null) {
        getFragmentManager().beginTransaction()
                .add(R.id.container, new PlaceholderFragment())
                .commit();
    }

    // Get access to the buttons
    final Button buttonTest = (Button)findViewById(R.id.buttonTest);
}

它编译得很好。但是当我运行它时, buttonTest 变量会以空指针的形式返回。为什么找不到 buttonTest 对象?

4

3 回答 3

6

我想我找到了解决方案。MainActivity.java 设置activity_main.xml,然后使用fragment_main.xml 作为其(最初)单一的主要片段。这就是为什么我们应该将所有的活动 UI 主要放在 fragment_main.xml 中(实际上将 NOTHING 放在 activity_main.xml 中)。

在 MainActivity.java 的底部附近有一个部分用于初始化 fragment_main.xml。正是在那里,我需要访问片段的 UI 的按钮和其他对象。如:

/**
 * A placeholder fragment containing a simple view.
 */
public static class PlaceholderFragment extends Fragment {

    public PlaceholderFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_main, container, false);

        // Get access to the buttons
        final Button buttonAvailableOptions = (Button)rootView.findViewById(R.id.buttonAvailableOptions);

        return rootView;
    }
}

上面的大部分内容是由 Android Studio 自动添加的。以“获取按钮的访问权限”开头的部分是我的,您可以在其中设置对按钮和其他 UI 对象的任何访问或处理。

于 2014-02-13T00:07:27.923 回答
1

findViewById()找不到按钮的原因是因为只setContentView()findViewById()layout.xml提供给的文件中查找setContentView(),而您的按钮不在R.layout.activity_main. 如果您的按钮位于Fragment(它看起来是)中,那么您应该从 而Fragment不是Activity. 这确保您ActivityFragment逻辑保持解耦,允许您重新使用Fragment不同的Activities.

于 2014-02-12T22:58:43.357 回答
0

你可以这样使用。

final Button buttonAvailableOptions = getActivity().findViewById(R.id.buttonAvailableOptions);
于 2019-01-23T03:12:28.977 回答