gpt4 book ai didi

android - 在运行时写入 Manifest.xml

转载 作者:太空狗 更新时间:2023-10-29 14:22:59 24 4
gpt4 key购买 nike

我创建了一个作为库的项目,该库正在设置一个带有 SlideMenuActionBarSherlock。在这个 Slidemenu 中,我有一个 ListView。当用户按下此 ListView 中的一项时,一个新的 Activity 应该启动。我的 ListView 有一个像这样的适配器:

public class MenuAdapter extends BaseAdapter {

Context context;
Activity act;
ArrayList<SlideMenuItem> menuItemList;

public MenuAdapter(Activity act, int workflowMenu) {
this.act = act;
this.context = act.getApplicationContext();
parseXml(workflowMenu);
}

@Override
public int getCount() {
return menuItemList.size();
}

@Override
public Object getItem(int position) {
return menuItemList.get(position);
}

@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View rowView = convertView;
if (rowView == null) {
LayoutInflater inflater = act.getLayoutInflater();
rowView = inflater.inflate(R.layout.slidemenu_listitem, null);
MenuItemHolder viewHolder = new MenuItemHolder();
viewHolder.label = (TextView) rowView.findViewById(R.id.menuLabel);
viewHolder.icon = (ImageView) rowView.findViewById(R.id.menu_icon);
rowView.setTag(viewHolder);
}

MenuItemHolder holder = (MenuItemHolder) rowView.getTag();
String s = menuItemList.get(position).label;
holder.label.setText(s);
holder.icon.setImageDrawable(menuItemList.get(position).icon);

rowView.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
SlideMenuItem item = (SlideMenuItem) getItem(position);
Toast.makeText(context, "Id: " + Integer.toString(item.id), Toast.LENGTH_SHORT).show();

}
});

return rowView;
}

public class SlideMenuItem {
public int id;
public Drawable icon;
public String label;
}

class MenuItemHolder {
public TextView label;
public ImageView icon;
}

private void parseXml(int menu) {

menuItemList = new ArrayList<SlideMenuItem>();

try {
XmlResourceParser xpp = context.getResources().getXml(menu);

xpp.next();
int eventType = xpp.getEventType();

while (eventType != XmlPullParser.END_DOCUMENT) {

if (eventType == XmlPullParser.START_TAG) {

String elemName = xpp.getName();

if (elemName.equals("item")) {

String textId = xpp.getAttributeValue(
"http://schemas.android.com/apk/res/android",
"title");
String iconId = xpp.getAttributeValue(
"http://schemas.android.com/apk/res/android",
"icon");
String resId = xpp.getAttributeValue(
"http://schemas.android.com/apk/res/android",
"id");

SlideMenuItem item = new SlideMenuItem();
item.id = Integer.valueOf(resId.replace("@", ""));
item.icon = context.getResources().getDrawable(
Integer.valueOf(iconId.replace("@", "")));
item.label = resourceIdToString(textId);

menuItemList.add(item);

Log.v("ADDED ITEM LABEL: ", item.label); //This triggers with the right labels, so the listview does exist!
}

}

eventType = xpp.next();

}
Log.v("MenuList: ", "Size: " + Integer.toString(menuItemList.size()));
for(SlideMenuItem item : menuItemList) {
Log.v("MenuList: ", Integer.toString(item.id) + ": " + item.label);
}

} catch (Exception e) {
e.printStackTrace();
}

}

private String resourceIdToString(String text) {
if (!text.contains("@")) {
return text;
} else {
String id = text.replace("@", "");
return context.getResources().getString(Integer.valueOf(id));

}
}
}

workflowMenu 参数是一个包含菜单项的 xml 文件,因此可以填充 ListView :

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

<item
android:id="@+id/item_one"
android:icon="@drawable/ic_launcher"
android:title="Item 1">
</item>
<item
android:id="@+id/item_two"
android:icon="@drawable/ic_launcher"
android:title="Item 2">
</item>
<item
android:id="@+id/item_three"
android:icon="@drawable/ic_launcher"
android:title="Item 3">
</item>
<item
android:id="@+id/item_four"
android:icon="@drawable/ic_launcher"
android:title="Item 4">
</item>
<item
android:id="@+id/item_five"
android:icon="@drawable/ic_launcher"
android:title="Item 5">
</item>
<item
android:id="@+id/item_seven"
android:icon="@drawable/ic_launcher"
android:title="Item 6">
</item>
<item
android:id="@+id/item_six"
android:icon="@drawable/ic_launcher"
android:title="Item 7">
</item>
</menu>

在我的 MainProject 中,库是这样调用的:

public class MainActivity extends BaseWindow {

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.InitializeWindow(MainActivity.this, R.layout.activity_main, R.menu.slide_menu, "Home");


}

BaseWindow 将设置所有必要的 GUI。当我想启动一个新的 Activity 时,当用户按下我库中 listView 中的一个项目时,就会出现问题。

如果 listview 是在与我相同的项目中构建的,我可以只在一个 Manifest 文件中指定 Activity 并在适配器内启动 Activity ,如下所示:

rowView.setOnClickListener(new OnClickListener() {

public void onClick(View v) {
launchActivity(position);
}

});

public void launchActivity(int position) {

Class<?> cls = null;
switch (menuItemList.get(position).id) {
case R.id.item_one:
cls = FirstClass.class;
act.finish();
break;
}
Intent intent = new Intent(context, cls);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}

但是由于适配器在另一个项目(库)中,我还必须在库 list 中声明 Activity 。如果我不知道这项 Activity 的名称,我不知道该怎么做。而且我想由于安全原因,无法在运行时写入 list 或创建 Activity 声明。

有人知道我想在这里实现什么吗?请给我一些关于如何解决这个问题的建议。

有什么不明白的就问吧。

谢谢!

最佳答案

嘿嘿嘿)

您可以只在 App 项目中声明来自库项目的 Activity 。但请仔细考虑一下:Activity 表单库如何知道要在应用程序上调用哪个 Activity?

您很可能希望在您的 App 项目中扩展 LibraryActivity 并包含仅与该应用相关的部分代码。

关于android - 在运行时写入 Manifest.xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15070637/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com