[英]How can I dynamically create a list of all Android ui components programmatically? e.g. TextView, ImageView etc
[英]How can I count the number each variable type, appears in an Android class? e.g. int, string etc
我已經創建了一個小的Android應用程序,它可以讀取特定的Android類(.java)。
我想(但目前不知道如何):
5個常規整數 , 3個常規字符串 , 1個常規可繪制對象 , 2個ArrayList
函數A: 2個常規整數 , 1個常規字符串
函數B: 3個常規可繪制對象 , 4個ArrayList int
到目前為止,我已經弄清楚了以下內容,但是由於程序性質,它無法正常工作:
int numberofArrayLists = Collections.frequency(androidClass, "ArrayList<String>");
int numberofIntLists = Collections.frequency(androidClass, "ArrayList<Int>");
int numberofBooleanLists = Collections.frequency(androidClass, "ArrayList<Boolean>");
我的代碼:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
ArrayList<String> androidClass = readAndroidClass("/sdcard/MainActivity.java");
} catch (IOException e) {
e.printStackTrace();
}
}
public ArrayList<String> readAndroidClass(String classLocationString) throws IOException {
ArrayList<String> androidClass = new ArrayList<String>();
FileInputStream is;
BufferedReader reader;
final File classLocation = new File(classLocationString);
if (classLocation.exists()) {
is = new FileInputStream(classLocation);
reader = new BufferedReader(new InputStreamReader(is));
String line = reader.readLine();
while(line != null){
androidClass.add(reader.readLine());
}
}
return androidClass;
}
嘗試上述操作的Android Java類示例:
public class MainActivity extends ListActivity {
private PackageManager packageManager = null;
private List<ApplicationInfo> applist = null;
private ApplicationAdapter listadaptor = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
packageManager = getPackageManager();
new LoadApplications().execute();
}
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
return true;
}
public boolean onOptionsItemSelected(MenuItem item) {
return false;
}
private List<ApplicationInfo> checkForLaunchIntent(List<ApplicationInfo> list) {
ArrayList<ApplicationInfo> applist = new ArrayList<ApplicationInfo>();
for (ApplicationInfo info : list) {
try {
if (null != packageManager.getLaunchIntentForPackage(info.packageName)) {
applist.add(info);
}
} catch (Exception e) {
e.printStackTrace();
}
}
return applist;
}
private class LoadApplications extends AsyncTask<Void, Void, Void> {
private ProgressDialog progress = null;
@Override
protected Void doInBackground(Void... params) {
applist = checkForLaunchIntent(packageManager.getInstalledApplications(PackageManager.GET_META_DATA));
listadaptor = new ApplicationAdapter(MainActivity.this,
R.layout.snippet_list_row, applist);
return null;
}
@Override
protected void onCancelled() {
super.onCancelled();
}
@Override
protected void onPostExecute(Void result) {
setListAdapter(listadaptor);
progress.dismiss();
super.onPostExecute(result);
}
@Override
protected void onPreExecute() {
progress = ProgressDialog.show(MainActivity.this, null,
"Loading application info...");
super.onPreExecute();
}
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
}
}
在類級別對變量進行計數:
為聲明語句創建框架:
AccessMode OtherQualifier數據類型VariableName EndMarker
where
AccessMode = { private, public, protected }
OtherQualifier = { static }
DataType = { int, char, string, boolean ..}
VariableName = { anything }
EndMarker = { ; , }
編寫函數以檢測行是否為變量聲明
private boolean isLineVariableDeclaration(String line)
{
this.hasAccessMode(line)
// call other functions too ..
}
private bool hasAccessMode(String line)
{
String access = line.Split(" ")[0].toLowerCase();
// Check if AccessMode list has "access"
// return true if it exists
}
private bool hasOtherQualifier(String line)
{
String qualifier = line.Split(" ")[1].toLowerCase();
// Check if OtherQualifier list has "qualifier"
// return true if it exists
}
private bool hasDataType(String line)
{
String dataType = line.Split(" ")[2].toLowerCase();
// Check if DataType list has "dataType"
// return true if it exists
}
private bool hasEndMarker(String line)
{
String endMarker = line.Split(" ")[3].toLowerCase();
// Statement looks like
// private static int someVar;
if(endMarker.Equals(";"))
{
// since this is line end
// return true;
}
// Statement looks like
// private static int someVar, someOtherVar;
else if(endMarker.Equals(","))
{
// this means there are more variables so such type
// do more to collect them
}
}
在函數內部對變量進行計數:
為聲明語句創建框架:
OtherQualifier數據類型變量名EndMarker
where
OtherQualifier = { static }
DataType = { int, char, string, boolean ..}
VariableName = { anything }
EndMarker = { ; , }
使用類似的方法,在此處編寫函數。 為了找到“ {”和“}”的存在,即檢測功能的啟動和關閉,請做一件事:
int bracesCounter = 0;
{
,增加大bracesCounter
bracesCounter
bracesCounter
再次為零時,您就超出了功能范圍 要計算if語句的數量:
為語句創建框架:
IF_KEYWORD LEFT_FUNCTION_BRACKET EXPRESSION RIGHT_FUNCTION_BRACKET OTHER
where
IF_KEYWORD = { if }
LEFT_FUNCTION_BRACKET = { ( }
EXPRESSION = { WITHOUT_OPERATOR, WITH_OPERATOR }
WITHOUT_OPERATOR = { SIMPLE_OPERAND, OPERAND_WITH_FUNC }
SIMPLE_OPERAND = { OPERAND }
OPERAND_WITH_FUNC = { OPERAND.FUNC(), !OPERAND.FUNC() }
WITH_OPERATOR = { SIMPLE_OPERAND_WITH_OPERATOR, OPERAND_WITH_FUNC_OPERATOR }
SIMPLE_OPERAND_WITH_OPERATOR = { LEFT_OPERAND OPERATOR RIGHT_OPERAND }
OPERAND_WITH_FUNC_OPERATOR = { OPERAND_WITH_FUNC OPERATOR OPERAND_WITH_FUNC }
LEFT_OPERAND = { OPERAND }
RIGHT_OPERAND = { OPERAND }
OPERATOR = { !=, ==, >, <, >=, <= }
OTHER = { RIGHT_CURLY_BRACES, NEW_LINE}
RIGHT_CURLY_BRACES = { { }
NEW_LINE = { \n }
so on and so forth..
但是,如果您的要求僅僅是計算if(或while)的數量,那么上面的內容可能對您來說很繁瑣。 因此,您可以執行此操作
if
請檢查是否后面跟着(
(
將方括號增加1,並且每當您遇到相遇時)
將方括號減少1。 0
,如果條件語句成功解析 0
請查看其后是否跟{
{
將括號增加1,並且遇到}
將括號減小1。 0
,如果語句成功解析 大功告成!
PS修改以上算法以滿足您的需求
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.