在 Fragment 中使用 Activity 方法

Posted

技术标签:

【中文标题】在 Fragment 中使用 Activity 方法【英文标题】:Using Activity methods in Fragment 【发布时间】:2016-11-27 21:04:34 【问题描述】:

您好,我是 android 的业余爱好者,在我的片段类中使用活动方法时遇到了很大的问题。

我想实现setContentViewfindViewByIdgetMenuInflater。不幸的是,我不知道该怎么做。

public class WagaFragment extends Fragment

    private Spinner fromSpinner, toSpinner;
    private EditText fromEditText, toEditText;


    @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        **setContentView**(R.layout.activity_main);


        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.units, android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        fromSpinner = (Spinner) **findViewById**(R.id.spinner_from);
        toSpinner = (Spinner) **findViewById**(R.id.spinner_to);

        fromSpinner.setAdapter(adapter);
        toSpinner.setAdapter(adapter);

        fromEditText = (EditText) **findViewById**(R.id.editText_from);
        toEditText = (EditText) **findViewById**(R.id.editText_to);


        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        toolbar.setTitle(R.string.app_name);
        toolbar.setTitleTextColor(Color.YELLOW);


    

    @Override
    public boolean onCreateOptionsMenu(Menu menu) 
        // Inflate the menu; this adds items to the action bar if it is present.
        **getMenuInflater()**.inflate(R.menu.menu_main, menu);
        return true;
    

    public void konwertuj(View view) 
        // Get the string from the Spinners and number from the EditText
        String fromString = (String) fromSpinner.getSelectedItem();
        String toString = (String) toSpinner.getSelectedItem();
        double input = Double.valueOf(fromEditText.getText().toString());

        // Convert the strings to something in our Unit enu,
        Konwerter.Jednostka fromJednostka = Konwerter.Jednostka.fromString(fromString);
        Konwerter.Jednostka toJednostka = Konwerter.Jednostka.fromString(toString);

        // Create a converter object and convert!
        Konwerter konwerter = new Konwerter(fromJednostka, toJednostka);
        double result = konwerter.convert(input);
        toEditText.setText(String.valueOf(result));
    
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
        return inflater.inflate(R.layout.tab_fragment_1, container, false);

    


【问题讨论】:

你必须回到片段的基础。这不是你如何创建和膨胀片段以及访问一些你可以使用 getActivity() 的 Activity 方法 在设计片段时,您不应该在片段中使用活动的方法。相反,您应该将片段设计为具有与其父活动的标准和预定义接口的独立框。片段不应打破其边界,例如片段不应使用其片段的setContentView。片段必须只对自己的视图负责而不是其父活动的视图。 【参考方案1】:

在 Fragments 中,“contentView”(你的意思是)在public View onCreateView 过程中定义。

根据您的代码: 你必须使用

View view = inflater.inflate(R.layout.tab_fragment_1, container, false);
<your control> = <Control type> view.findViewById(<control id>)

对于 MenuInflater 试试这个:

MenuInflater inflater = getActivity().getMenuInflater();

【讨论】:

【参考方案2】:

在 onCreateView 试试:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
  Bundle savedInstanceState) 
    View view = inflater.inflate(R.layout.fragment_name, container, false);
    fromSpinner = (Spinner) view.findViewById(R.id.spinner_from);
    return view;
  

【讨论】:

以上是关于在 Fragment 中使用 Activity 方法的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式通过 Main Activity 在 ViewPager 中更新刷新片段

学习安卓开发[2] - 在Activity中托管Fragment

Fragment与Activity生命周期关系

Fragment与Activity交互

在 Fragment 中使用 Activity 方法

在Activity和附贴的Fragment中同时使用多Surface错乱解决