我是android的新手,我正在用androidstudio编写我的第一个应用程序。
我有两个活动:第一个有一堆按钮,都共享相同的onClick()事件,它启动第二个活动。第二个活动只有一个按钮。这两种布局都是使用交互式GUI编辑器设计的。
我希望第二个活动的按钮看起来与第一个活动中的按钮相似(但不完全相同)。经过大量研究,我成功识别了源按钮的 drawableLeft ,并将其名称传递给第二个活动,然后将其设置为目标按钮。但是,我发现这种方法过于局限和复杂,考虑到我可能需要传递其他数据,如颜色等。
这就是我现在正在做的事情:第一个活动中的按钮将其标记设置为drawableLeft的资源名称。在onClick()事件中,标记被读取并通过putExtra()发送到第二个活动。第二个活动接收资源的名称,通过getResources()。getIdentifier获取resourceID,通过getDrawable()创建drawable,最后通过setCompoundDrawablesWithIntrinsicsBounds()将其设置为目标。
问题是:1)我必须为活动1中的每个按钮冗余设置标记属性; 2)我还想复制其他属性,比如颜色和谁知道还有什么 - 我应该在标签中填充所有内容吗?
最后一个问题:是否有更简单的方法来获取GUI属性并将其转发到第二个活动?
谢谢你, linuxfan
答案 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;在布局文件中,必须将按钮放入容器中。哦,好吧......
我认为,最后,应该删除新创建的按钮,但无论如何它都是隐形的,所以这并不重要。
编辑:不,按钮是可见的。我不得不删除它。