【问题标题】:How to convert an activity to a fragment in Android Studio?如何在 Android Studio 中将活动转换为片段?
【发布时间】:2017-11-22 08:58:56
【问题描述】:

我有这个活动

package com.padilla.jorge.proyecto_aplicaciones_moviles;


import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

import java.util.ArrayList;
import java.util.Calendar;



public class VerPerfil extends AppCompatActivity {
private String[] arraySpinner;
Intent i;
TextView Nombre_TextView;
TextView Email_TextView;
TextView Password_TextView;
TextView Puntos_TextView;

TextView getNombre;
TextView getEmail;
TextView getPassword;
TextView getPuntos;


ArrayList<TextView> textViewsVal;
ArrayList<TextView> textViewsName;

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference reference;

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_ver_perfil);
    Nombre_TextView=(TextView)findViewById(R.id.Nombre_textView);
    Email_TextView=(TextView)findViewById(R.id.Email_TextView);
    Password_TextView=(TextView)findViewById(R.id.Password_TextView);
    Puntos_TextView=(TextView)findViewById(R.id.Puntos_TextView);
    getNombre=(TextView)findViewById(R.id.Nombre_valor);
    getEmail=(TextView)findViewById(R.id.Email_valor);
    getPassword=(TextView)findViewById(R.id.Password_valor);
    getPuntos=(TextView)findViewById(R.id.Puntos_valor);


    textViewsName = new ArrayList<TextView>();
    textViewsName.add(Nombre_TextView);
    textViewsName.add(Email_TextView);
    textViewsName.add(Password_TextView);
    textViewsName.add(Puntos_TextView);

    textViewsVal = new ArrayList<TextView>();
    textViewsVal.add(getNombre);
    textViewsVal.add(getEmail);
    textViewsVal.add(getPassword);
    textViewsVal.add(getPuntos);
    Intent name_intent=this.getIntent();
    final String name=name_intent.getExtras().getString("name");

    reference = database.getReference(name).child("Perfil");
    reference.addValueEventListener(new ValueEventListener() {

        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            //rutina.setText(dataSnapshot.getKey());
            int i = 0;
            Log.d("number of childs",""+dataSnapshot.getChildrenCount());

            for (DataSnapshot child : dataSnapshot.getChildren()) {

                if (i < 10) {
                    textViewsName.get(i).setText(child.getKey());
                    textViewsVal.get(i).setText(child.getValue().toString());
                    Log.d("User key", child.getKey());
                    Log.d("User ref", child.getRef().toString());
                    Log.d("User val", child.getValue().toString());
                    i++;
                }

            }
        }


        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });


}

}

我想知道是否有一种简单的方法可以将其转换为片段?任何帮助,将不胜感激。 我想这样做的原因是因为我想实现一个导航抽屉菜单,我已经看到你必须使用片段(我知道有一种方法可以用类来做到这一点,但它更复杂)而且我已经有了这个类,所以我想重用它而不是从头开始创建一个新片段。

【问题讨论】:

    标签: java android android-activity android-fragmentactivity


    【解决方案1】:

    让我们试试这个:

    1. 扩展片段并将MyActivityClass重构为MyFragmentClass

    原始public class MyActivityClass extends AppCompatActivity
    转换public class MyFragmentClass extends Fragment

    1. 创建工厂方法并将您从getIntent().getExtra() 获得的所有值添加为该方法的参数

    原创String name=getIntent.getExtras().getString("name");

    已转换

    这个

    public static MyFragmentClass newInstance(String name){
        MyFragmentClass fragment = new MyActivity();
        Bundle args = new Bundle();
        args.putString(KEY_NAME, name);
        fragment.setArguments(args);
        return fragment;
    }
    

    还有这个,

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            name = getArguments().getString(KEY_NAME);
        }
    }
    
    1. 覆盖方法onCreateView() 并扩充您的布局

    原创setContentView(R.layout.activity_layout);

    已转换

    @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.activity_layout, container, false);
            return view;
        }
    
    1. 将所有findViewById(...);语句放入onCreateView()并重命名为view.findViewById(...)和其他不需要Activity运行的代码。

    2. 覆盖onActivityCreated()并将所有需要Activty的代码放在此处。

    3. 删除已转换为片段的代码

    这不是完美的答案,但应该会有所帮助。

    【讨论】:

      【解决方案2】:

      试试这个:

      1. 创建片段
      2. 将代码和布局改为片段
      3. 现在您有了一个可重复使用的片段
      4. 在您的活动或导航抽屉或您喜欢的任何地方添加片段

      【讨论】:

      • 好的,但是代码中有几个部分在片段中发生了变化,对吧?例如,我需要一个 onCreateView() 而不仅仅是 onCreate()。这是我的问题,如何将我的代码容纳到一个空的片段活动中?
      猜你喜欢
      • 2018-11-06
      • 2023-03-23
      • 1970-01-01
      • 2015-06-21
      • 2021-07-23
      • 1970-01-01
      • 2020-10-21
      • 1970-01-01
      相关资源
      最近更新 更多