如何从片段初始化按钮

时间:2016-11-03 05:46:42

标签: android android-fragments

我在片段中有一个按钮,我需要能够在活动中访问它来更改它的文本。我在我的主要活动中使用此代码:

CategoryFragment frag = new CategoryFragment();

getSupportFragmentManager().beginTransaction().add(R.id.activity_main, frag).commit();

frag.setButtonText(i);

问题是按钮永远不会使用onCreateView()方法初始化(该方法永远不会被调用),这会导致空指针异常。我尝试在片段中添加一个onCreate()方法,它被调用,但我必须获取视图才能初始化我的按钮。由于视图尚未初始化,我从视图中获得另一个空指针异常。这是我在onCreate()上的最佳尝试:

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

    button = (Button) getView().findViewById(R.id.buttonFrag);

}

4 个答案:

答案 0 :(得分:1)

OnCreateView()中这样做:

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.yout_layout, container, false);
    button = (Button) rootView.findViewById(R.id.buttonFrag);
    return rootView;
}

答案 1 :(得分:1)

你完全误解了Fragment和Activity相互协作的方式。活动主要有责任显示"片段,您需要使用CategoryFragment类初始化Button。

覆盖Category Fragment' onActivityCreated(),然后添加以下内容:

Button button = (Button) getView.findViewById(R.id.your_views_id);
button.setButton("Voila");

答案 2 :(得分:0)

关于活动和片段交互的研究。这可能对你有帮助。 http://simpledeveloper.com/how-to-communicate-between-fragments-and-activities/

答案 3 :(得分:0)

您可以使用“静态工厂方法”参考以下代码

public class CategoryFragment extends Fragment {

/**
 * Static factory method that takes an int parameter,
 * initializes the fragment's arguments, and returns the
 * new fragment to the client.
 */
public static CategoryFragment newInstance(String i) {
    CategoryFragment f = new CategoryFragment();
    Bundle args = new Bundle();
    args.putInt("buttonText", i);
    f.setArguments(args);
    return f;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        mParam = getArguments().getString("buttonText");
    }
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view=inflater.inflate(R.layout.fragment_category, container, false);
    Button b=(Button) view.findViewById(R.id.button);
    b.setText(mParam);

   return view;
 }
}

并从您的活动中致电

getSupportFragmentManager().beginTransaction().add(R.id.activity_main, CategoryFragment.newInstance(i)).commit();