【问题标题】:converting activity into fragment将活动转化为片段
【发布时间】:2020-03-30 19:52:05
【问题描述】:

这是一个在单击button 时播放声音的简单代码,此代码最初是在 Activity 中编写的,但现在我想将其更改为 Fragments。

错误

1) 对于 Rajathmusic 类型,方法 setContentView(int) 未定义。

2) MediaPlayer 类型中的方法create(Context, int) 不适用于参数(Rajathmusic, int)。

3)Rajathmusic 类型的方法findViewById(int) 未定义。

我刚刚开始进行 android 开发,任何帮助将不胜感激!

public class Rajathmusic extends Fragment {

private static final String TAG = "MyActivity";

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

    setContentView(R.layout.activity_main);

    Log.v(TAG, "Initializing sounds...");

    final MediaPlayer mp = MediaPlayer.create(this, R.raw.rajath);

    Button play_button = (Button)this.findViewById(R.id.button3);

    play_button.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            Log.v(TAG, "Playing sound...");
            mp.start();
        }
    });
    Log.v(TAG, "Sounds initialized.");
}}

【问题讨论】:

    标签: android android-fragments android-activity


    【解决方案1】:
    1. Fragment 有一个名为 onCreateView(LayoutInflater, ViewGroup, Bundle) 的方法。覆盖它,使用布局膨胀并返回视图。
    2. 由于创建方法需要Context,因此使用getActivity() 传递它
    3. findViewById(int) 可以称为getView().findViewById(R.id.button3)

    这是一个示例代码:

    public class Rajathmusic extends Fragment {
    
        private static final String TAG = "MyActivity";
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            return inflater.inflate(R.layout.activity_main, container, false);
        }
    
        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
            Log.v(TAG, "Initializing sounds...");
    
            final MediaPlayer mp = MediaPlayer.create(getActivity(), R.raw.rajath);
    
            View v = getView();
    
            Button play_button = (Button) v.findViewById(R.id.button3);
    
            play_button.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    Log.v(TAG, "Playing sound...");
                    mp.start();
                }
            });
            Log.v(TAG, "Sounds initialized.");
        }
    
    }
    

    阅读更多关于Fragment生命周期here的信息,了解我为什么将代码放在onActivityCreated而不是onCreate

    【讨论】:

    • super.onCreate(savedInstanceState);在这个 public void onActivityCreated(Bundle savedInstanceState) {
    【解决方案2】:

    片段中的onCreate方法通常写成-

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState){
    

    并使用-

    final MediaPlayer mp = MediaPlayer.create(getActivity(), R.raw.rajath);
    Button play_button = (Button) view.findViewById(R.id.button3);
    

    如果您想了解更多有关片段的信息。 Check this link.

    【讨论】:

      【解决方案3】:

      在重写方法OnActivityCreated(...) 中使用此代码,而不是this 使用getActivity(),因为新片段不再是活动。

      【讨论】:

        【解决方案4】:

        从活动中复制onCreate()方法的代码并将其粘贴到片段的onCreateView()方法中。

        要修复错误,请传递getActivity 代替此关键字并使用getView().findViewById()

        【讨论】:

          猜你喜欢
          • 2015-06-21
          • 2018-11-06
          • 1970-01-01
          • 1970-01-01
          • 2023-03-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多