【问题标题】:Dynamically changing views动态改变视图
【发布时间】:2020-09-11 05:33:58
【问题描述】:

我有一个 radioGroup,它有 4 个按钮,即 1、2、3、4、5。

如果用户单击单选按钮 1,视图应该在单选组下方的同一活动中显示不同的布局视图。如果用户单击 2,它应该显示一些其他布局视图。我的目标是根据所选单选按钮更改相同布局和活动中的视图。

我可以根据不同的radioButtons改变textview的文本。

这很容易!

但是改变整个视图呢?

【问题讨论】:

  • 如果视图不复杂,请将它们放在布局中,并在选择收音机后将可见性设置为 GONE,将适当的视图可见性设置为可见
  • 但我的观点就像占据了整个观点
  • 对不起,我没听懂,能详细点吗?
  • 我有五个不同的布局,每个radioButton都有一个。如果我单击了一个单选按钮,则应在我的活动布局上填充适当的布局。我该怎么做?

标签: android layout dynamic view


【解决方案1】:

在这种情况下,我喜欢使用 Radio 组下方的 Frame 布局作为 Fragment 容器

    <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

            <RadioGroup
                android:id="@+id/radio_group"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:checkedButton="@id/net_sales_radio_button">

                <androidx.appcompat.widget.AppCompatRadioButton
                    android:id="@+id/rb_one"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="1"
                    />

                <androidx.appcompat.widget.AppCompatRadioButton
                    android:id="@+id/rb_two"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="2"
                    />

                <androidx.appcompat.widget.AppCompatRadioButton
                    android:id="@+id/rb_three"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="3"
                    />

                <androidx.appcompat.widget.AppCompatRadioButton
                    android:id="@+id/rb_four"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="4"
                    />

            </RadioGroup>


             <FrameLayout
                android:id = "@+id/fragment_container"
                android:layout_width = "match_parent"
                android:layout_height = "0dp"
                android:layout_weight="1"/>


        </LinearLayout>

从这里您可以轻松地使用 Fragment 事务根据选择的单选按钮切换布局。

Fragment fragment = new LogInFragment();
            getSupportFragmentManager().beginTransaction()
                    .replace(R.id.fragment_container, fragment)
                    .commit();

出于几个原因,我更喜欢这种方法而不是简单地将布局包含在父布局中。

  1. 因为它可以让您保持 Activity 的代码更干净,因为与每个子布局相关的代码将存在于它们的 Fragment 上,远离父 Activity。

  2. 它还可以使您的父活动 XML 文件保持干净,因为您不必担心放置一堆 &lt;include&gt; 标记或其他与子布局有关的视图。

如果你想在 MainActivity 中访问 Fragments 的编辑文本,这里有一个很酷的技术。

  1. 创建一个接口类,该类将为片段所具有的每个编辑文本返回一个值。如果您的 Fragments 有用户数据,我在下面创建了一个。如果您的 Fragment 中有很多编辑文本,并且您不希望界面中有很多功能,请创建一个模型类,其中包含您需要的字段并让界面返回该模型。
public interface FormCallbacks {
    String getUserName();
    String getAddress();
    String getPhone();
}
  1. 让每个 Fragment 实现接口并在回调方法中返回编辑文本的值
public class UserOneFragment extends Fragment implements FormCallbacks {

    private EditText etUserName;
    private EditText etAddress;
    private EditText etPhone;

    @Override
    public String getUserName() {
        return etUserName.getText().toString();
    }

    @Override
    public String getAddress() {
        return etAddress.getText().toString();
    }

    @Override
    public String getPhone() {
        return etPhone.getText().toString();
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return super.onCreateView(inflater, container, savedInstanceState);
    }
}

  1. 从 MainActivity 访问回调
Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container);
        if (fragment instanceof FormCallbacks) {
            FormCallbacks callbacks = (FormCallbacks) fragment;
            String userName = callbacks.getUserName();
            String address = callbacks.getAddress();
            String phone = callbacks.getPhone();
        }

【讨论】:

  • 我可以从我的 Main Activity 访问片段内的小部件吗?
  • 因为我想从片段内的编辑文本中获取值并在我的主活动中执行常见操作
  • 是的,谢谢您的回复:)
【解决方案2】:

您可以在广播组中设置onCheckedChangeListener()

radioGrp.setOnCheckedChangeListener { _, checkedRadioId ->

            when (checkedRadioId) {
                radioOne.id -> {
                    //inflate your desired view
                }
                radioTwo.id -> {
                    //inflate your second view
                }
            }
        }

为了扩充新视图,

var view = layoutInflater.inflate(R.layout.newlayout, null) as LinearLayout
container.addView(view)

由于这些views 可能会超出屏幕高度,因此您可以将父视图放在scrollview 中。

希望这会对你有所帮助。

【讨论】:

  • 我可以从我的活动类访问膨胀视图内的小部件吗?
  • 是的,您可以访问所有小部件。
  • 是的,谢谢:)
猜你喜欢
  • 2016-12-26
  • 1970-01-01
  • 1970-01-01
  • 2015-10-03
  • 1970-01-01
  • 2014-09-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多