Android:如何在另一个活动中重新创建相同的按钮(View)

时间:2016-12-23 13:28:38

标签: android

我是android的新手,我正在用androidstudio编写我的第一个应用程序。

我有两个活动:第一个有一堆按钮,都共享相同的onClick()事件,它启动第二个活动。第二个活动只有一个按钮。这两种布局都是使用交互式GUI编辑器设计的。

我希望第二个活动的按钮看起来与第一个活动中的按钮相似(但不完全相同)。经过大量研究,我成功识别了源按钮的 drawableLeft ,并将其名称传递给第二个活动,然后将其设置为目标按钮。但是,我发现这种方法过于局限和复杂,考虑到我可能需要传递其他数据,如颜色等。

这就是我现在正在做的事情:第一个活动中的按钮将其标记设置为drawableLeft的资源名称。在onClick()事件中,标记被读取并通过putExtra()发送到第二个活动。第二个活动接收资源的名称,通过getResources()。getIdentifier获取resourceID,通过getDrawable()创建drawable,最后通过setCompoundDrawablesWithIntrinsicsBounds()将其设置为目标。

问题是:1)我必须为活动1中的每个按钮冗余设置标记属性; 2)我还想复制其他属性,比如颜色和谁知道还有什么 - 我应该在标签中填充所有内容吗?

最后一个问题:是否有更简单的方法来获取GUI属性并将其转发到第二个活动?

谢谢你, linuxfan

2 个答案:

答案 0 :(得分:1)

有两种方法可以实现您的目标。为您的按钮创建一个单独的xml文件。

<Button 
   android:id="@+id/your_btn"
   android:layout_width="50dp"
   android:layout_height="50dp"
   android:padding="10dp"/>

现在你可以做的就是你的活动

 public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.yourActivityLayout);
   //this ViewGroup should be inside yourActivityLayout xml file
    ViewGroup group = findViewById(R.id.where_you_want_your_btn);

    getLayoutInflater().inflate(R.layout.your_btn_layout,group,false);

}

您可以创建片段或在活动中使用它,过程几乎与上面相同。

 private void addFragment(Fragment fragment){

    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
    fragmentTransaction.add(R.id.fragment_container,fragment);
    fragmentTransaction.commit();
}

只需创建一个包含您想要重复的布局的框架,然后从您的活动中调用addFragment(new YourFragment()); 由于您是新手,因此请点击here

了解更多详情

答案 1 :(得分:1)

我找到了一种方法,一种肮脏的方式,但它有效。所以我回复自己。 这个回复可能有些不一致,我是这个问题的新手,我还在试验。

正如Dhrumil Patel,Michael Dodd和Ujjwal Mainali所说,要走的路是提取要共享的视觉信息,并将它们放在易于访问的地方。对于活动1中所需的每个按钮,我创建了一个这样的布局资源:

&#34; file:tbt_turndown.xml&#34;:

<merge>
<Button xmlns:android="http://schemas.android.com/apk/res/android"
    android:tag="tbt_turndown"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Turn down"
    android:drawableLeft="@android:drawable/arrow_down_float"
    android:drawablePadding="8dp"
    />
</merge>

据我了解,这个文件应该只包含&#34;外观&#34;按钮,没有关于它在最终布局中的位置的信息。

然后,活动1的正常布局文件包含上面定义的按钮:

&#34; file:buttons_setup.xml&#34;:

<LinearLayout
    ...
    <TextView
        ...
    <GridLayout
        ...
        <include layout="@layout/tbt_turndown"
            android:id="@+id/button1"
            android:layout_row="1"
            android:layout_column="1"
            android:onClick="butClick" />

        <include layout="@layout/tbt_turnup"
            android:id="@+id/button2"
            android:layout_row="1"
            android:layout_column="2"
            android:onClick="butClick"
            />
        ...
    ...
    ...

这样做,在androidstudio GUI编辑器中发生了奇怪的事情:许多属性消失了,例如onClick和许多其他属性,而androidstudio抱怨&#34; layout_row&#34;被忽略,因为没有&#34; layout_width&#34;已指定。我手动编辑xml文件,设备中的应用运行正常。

所有这些按钮共享一个事件处理程序,如下所示:

public void butClick(View w) {
    // obtain info from the sender of this event
    // the tag contains the name of the resource used to build this View
    String myres = ((Button) w).getTag().toString();

    Intent myIntent = new Intent(this, settAButton.class);
    myIntent.putExtra("myres", myres);

    startActivityForResult(myIntent, 0);
}

新启动的活动必须显示所选按钮并让用户配置它。用户首选项将存储在非易失性存储器中的某处。一开始,此活动执行以下操作:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_settAButton);

    // obtain info from calling activity
    Bundle bundle=getIntent().getExtras();
    Integer tbtID = this.getResources().getIdentifier( bundle.getString("myres"), "layout", this.getPackageName());

    // inflate the resource (a Button) somewhere
    ViewGroup group = (ViewGroup) findViewById(R.id.llyMyBt);
    getLayoutInflater().inflate(tbtID, group, true);

    // get a reference to the newly created button
    Button mybut = (Button) group.getChildAt(group.getChildCount()-1);

    // now extract the wanted info - for now, just the drawableLeft
    Drawable draw = mybut.getCompoundDrawables()[0];

    // and assign it to destination
    ((Button) findViewById(R.id.btExample)).setCompoundDrawablesWithIntrinsicBounds(draw, null, null, null);
}

在这里,我有一个膨胀按钮布局的问题;我的第一次尝试是不将新创建的按钮分配给任何容器,但在运行时android坚持认为,使用&#34; merge&#34;在布局文件中,必须将按钮放入容器中。哦,好吧......

我认为,最后,应该删除新创建的按钮,但无论如何它都是隐形的,所以这并不重要。

编辑:不,按钮是可见的。我不得不删除它。