更改片段内布局的按钮

Posted

技术标签:

【中文标题】更改片段内布局的按钮【英文标题】:button to change layout inside fragment 【发布时间】:2018-05-28 21:18:38 【问题描述】:

所以我有一个带有选项卡式活动的应用程序,如果单击按钮(btlink),我想更改第一个选项卡的布局:

登录(第一个片段/标签)代码

    public class login extends Fragment
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) 
        View rootView = inflater.inflate(R.layout.login, container, false);
        final EditText etUtilizador = (EditText) getView().findViewById(R.id.etUtilizador);
        final EditText etPassword = (EditText) getView().findViewById(R.id.etPassword);
        final Button btLogin = (Button) getView().findViewById(R.id.btLogin);
        Button btlink = (Button) getView().findViewById(R.id.btlink);
        btlink.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 
                Intent registerIntent;
                registerIntent = new Intent(login.this, registar.class);
                login.this.startActivity(registerIntent);
            
        );
        return rootView;
    

但它在以下位置显示错误:“registerIntent = new Intent(login.this, registar.class);”

登录xml代码

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/constraintLayout"
android:layout_
android:layout_
>
<TextView
    android:id="@+id/section_label"
    android:layout_
    android:layout_
    android:layout_marginBottom="@dimen/activity_vertical_margin"
    android:layout_marginEnd="@dimen/activity_horizontal_margin"
    android:layout_marginStart="@dimen/activity_horizontal_margin"
    android:layout_marginTop="@dimen/activity_vertical_margin">
</TextView>

<EditText
    android:id="@+id/etUtilizador"
    android:layout_
    android:layout_
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_below="@+id/section_label"
    android:layout_marginTop="70dp"
    android:ems="10"
    android:hint="Utilizador"
    android:inputType="textPersonName"
    android:textColor="@color/colorPrimaryDark" />

<EditText
    android:id="@+id/etPassword"
    android:layout_
    android:layout_
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_below="@+id/etUtilizador"
    android:layout_marginTop="30dp"
    android:ems="10"
    android:hint="Password"
    android:inputType="textPassword"
    android:textColor="@color/colorPrimaryDark" />

<Button
    android:id="@+id/btLogin"
    android:layout_
    android:layout_
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_below="@+id/etPassword"
    android:layout_marginTop="41dp"
    android:background="@color/colorAccent"
    android:text="Login"
    android:textAppearance="@style/BotaoRegisto" />

<Button
    android:id="@+id/btlink"
    android:layout_
    android:layout_
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_below="@+id/btLogin"
    android:layout_marginTop="49dp"
    android:background="@color/colorAccent"
    android:text="Registar"
    android:textAppearance="@style/BotaoRegisto" />

<TextView
    android:id="@+id/tvregisto"
    android:layout_
    android:layout_
    android:layout_below="@+id/btLogin"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="14dp"
    android:text="TextView"
    android:textColor="@color/colorPrimary"
    tools:text="Se ainda nao tem conta registe-se aqui:" />

我只希望代码在单击按钮时将布局更改为此:

registar.xml

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/constraintLayout"
android:layout_
android:layout_>

<TextView
    android:id="@+id/section_label"
    android:layout_
    android:layout_
    android:layout_marginBottom="@dimen/activity_vertical_margin"
    android:layout_marginEnd="@dimen/activity_horizontal_margin"
    android:layout_marginStart="@dimen/activity_horizontal_margin"
    android:layout_marginTop="@dimen/activity_vertical_margin">

</TextView>

<EditText
    android:id="@+id/etNome"
    android:layout_
    android:layout_
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_below="@+id/section_label"
    android:layout_marginTop="70dp"
    android:ems="10"
    android:hint="Nome"
    android:inputType="textPersonName"
    android:textColor="@color/colorPrimaryDark" />

<EditText
    android:id="@+id/etEmail"
    android:layout_
    android:layout_
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_below="@+id/etNome"
    android:layout_marginTop="30dp"
    android:ems="10"
    android:hint="Email"
    android:inputType="textEmailAddress"
    android:textColor="@color/colorPrimaryDark" />

<Button
    android:id="@+id/btPedido"
    android:layout_
    android:layout_
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_below="@+id/etNumero"
    android:layout_marginTop="99dp"
    android:background="@color/colorAccent"
    android:elevation="0dp"
    android:text="Enviar pedido de registo"
    android:textAppearance="@style/BotaoRegisto" />

<EditText
    android:id="@+id/etNumero"
    android:layout_
    android:layout_
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_below="@+id/etEmail"
    android:layout_marginTop="30dp"
    android:ems="10"
    android:hint="Nº faturação ou série"
    android:inputType="textPersonName"
    android:textColor="@color/colorPrimaryDark" />

如果有人可以,我会很感激的。

【问题讨论】:

请附上您收到的完整错误信息。它发生的行很有帮助,但不如错误的文本有用。 @TheJim01 主要是getActivity()问题。 【参考方案1】:

首先设置 rootView 而不是 getView()

        final EditText etUtilizador = (EditText) rootView.findViewById(R.id.etUtilizador);
        final EditText etPassword = (EditText) rootView.findViewById(R.id.etPassword);
        final Button btLogin = (Button) rootView.findViewById(R.id.btLogin);
        Button btlink = (Button) rootView.findViewById(R.id.btlink);

并使用getActivity()

返回此片段当前关联的 Activity。

new Intent(getActivity(), registar.class);

代码将

        Intent registerIntent;
        registerIntent = new Intent(getActivity(), registar.class);
        getActivity().startActivity(registerIntent); 

【讨论】:

谢谢你这么笨的伙伴,我已经为此工作了整整一个星期,但无法弄清楚你刚刚让我开心。 @DimitriPutin 很高兴为您提供帮助。祝您编码愉快。 当 registar 只是一个 .xml 文件时,如何使用 registar.class ?我收到一个错误提示该类不存在【参考方案2】:

改变

Intent registerIntent;
                registerIntent = new Intent(login.this, registar.class);
                login.this.startActivity(registerIntent);

 Intent   registerIntent = new Intent(getActivity(), registar.class);
        startActivity(registerIntent);

也需要改变

 final EditText etUtilizador = (EditText) rootView.findViewById(R.id.etUtilizador);
 final EditText etPassword = (EditText) rootView.findViewById(R.id.etPassword);
 final Button btLogin = (Button) rootView.findViewById(R.id.btLogin);

【讨论】:

当 registar 只是一个 .xml 文件时,如何使用 registar.class ?我收到一条错误消息,提示该类不存在【参考方案3】:
public class login extends Fragment
Context context;    
@Override
onAttach(Activity activity)
context=(Context)activity;
...
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) 
...
 registerIntent = new Intent(context, registar.class);

【讨论】:

当 registar 只是一个 .xml 文件时,如何使用 registar.class ?我收到一条错误消息,提示该类不存在

以上是关于更改片段内布局的按钮的主要内容,如果未能解决你的问题,请参考以下文章

片段中的按钮自定义视图

片段内的按钮

片段内的VideoView导致黑屏闪烁

显示/隐藏片段并以编程方式更改可见性属性

Android在片段中动态更改部分布局的最佳方法

使用片段上的按钮更改片段