我的应用程序有Relative Layout
,其中包含scrollView
和Button
在scrollView
内部我主持另一个LinearLayout
我的“addPane
”
我的活动使用while循环将Text Views
放在addPane
内
在ocassion上我需要重新绘制这个结构,因为BroadcastReceiver
收到了一个电话
当我在调试模式中单步执行代码时,我实际上可以看到添加了新的TextView
,但我不会在屏幕上看到它。
我已尝试invalidate()
我的addPane
,scrollView
和RelativeLayout
。
我还尝试requestLayout()
所有这些
另外我每次都尝试setContentView
,所以它会以一个干净的新布局开始。
以编程方式创建addPane
而不是从布局中获取它也不起作用。
以上所有的解决方案都是我能找到的解决方案。
如果我关闭应用程序并重新打开它,TextView就会在那里(我正在从数据库中读取)所以我看到的唯一解释是我错过了刷新布局的东西。
如果有人想要一些代码:
public void setupMatches(){
SQLiteDatabase Database = openOrCreateDatabase("MatchDatabase",MODE_PRIVATE,null);
Cursor Query = Database.rawQuery("Select ID, Player1, Player2, Question, Score1, Score2, turn FROM MatchOverview WHERE NOT Question > 11;",null);
Query.move(-1);
LinearLayout root = findViewById(R.id.AddFrame);
root.invalidate();
root.removeAllViews();
String enemy ="";
Log.e("should have elements: ",""+Query.getCount());
while(Query.moveToNext()){
TextView Name = new TextView(this);
if(!Query.getString(1).equals(SetupAndTestConstants.Identity)) {
//Log.v("menu", "Creating GameButton named " + Query.getInt(0) + " with game ID " + Query.getInt(1));
enemy = Query.getString(1);
}else{
//Log.v("menu", "Creating GameButton named " + Query.getInt(2) + " with game ID " + Query.getInt(1));
enemy = Query.getString(2);
}
Name.setText(getResources().getString(R.string.menuButtonText) + " " + enemy);
Name.setOnClickListener(new MYonClickListener(Query.getInt(0),enemy,Query.getString(6), this));
if(Query.getString(6).equals(SetupAndTestConstants.Identity)){
Name.setBackgroundResource(R.drawable.border_can_play);
}else{
Name.setBackgroundResource(R.drawable.border_cant_play);
}
root.addView(Name);
}
Query.close();
TextView historyText = new TextView(this);
historyText.setText(getString(R.string.past));
historyText.setBackground(getResources().getDrawable(R.drawable.border_can_play));
historyText.setBackgroundColor(getResources().getColor(R.color.matchBackground));
root.addView(historyText);
Cursor Query2 = Database.rawQuery("Select ID, Player1, Player2, Score1, Score2, turn FROM MatchOverview WHERE NOT Question <= 11;",null);
Query2.move(-1);
while(Query2.moveToNext()){
TextView Name = new TextView(this);
Name.setBackgroundResource(R.drawable.border_neutral);
if(!Query.getString(1).equals(SetupAndTestConstants.Identity)) {
//Log.v("menu", "Creating GameButton named " + Query.getInt(0) + " with game ID " + Query.getInt(1));
enemy = Query.getString(1);
}else{
//Log.v("menu", "Creating GameButton named " + Query.getInt(2) + " with game ID " + Query.getInt(1));
enemy = Query.getString(2);
}
Name.setText(R.string.menuButtonText + enemy);
Name.setOnClickListener(new MYonClickListener(Query2.getInt(0),enemy,"",this));
root.addView(Name);
}
Query2.close();
Database.close();
newGame = (Button) findViewById(R.id.bNewGame);
newGame.setOnClickListener(this);
这是我的布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/activity_menu"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="that's basically my name so i cut it :D">
<ScrollView
android:id="@+id/scroll_view_main"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:id="@+id/AddFrame" />
</ScrollView>
<Button
android:textAllCaps="false"
android:text="@string/newGame"
android:background="@drawable/rounded_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/bNewGame"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true" />
</RelativeLayout>
这是广播接收器:
public class mainBroadcastReceiver extends BroadcastReceiver{
menu parent;
public mainBroadcastReceiver(menu parent){
this.parent = parent;
}
public void updateDatabaseFromJson(String table, String db, String data){
SQLiteDatabase database = openOrCreateDatabase(db,Context.MODE_PRIVATE,null);
database.beginTransaction();
for(String json_string : data.split(Pattern.quote("}, "))){
json_string += "}";
try {
JSONObject object = new JSONObject(json_string);
ContentValues contentValues = new ContentValues();
Iterator iterator = object.keys();
while (iterator.hasNext()){
String key = (String) iterator.next();
contentValues.put(key,String.valueOf(object.get(key)));
}
database.insertWithOnConflict(table, null,contentValues,SQLiteDatabase.CONFLICT_REPLACE);
} catch (JSONException e) {
e.printStackTrace();
database.endTransaction();
}
}
database.setTransactionSuccessful();
database.endTransaction();
database.close();
}
@Override
public void onReceive(Context context, Intent intent) {
String data = "";
try {
data = connection.getData(intent.getAction() + "|" + intent.getStringExtra("params"));
}catch(IllegalArgumentException e){
return;
}
if(data.equals("")){
Log.i("main - receiver", "empty response?");
return;
}
switch (intent.getAction()){
case "QUESTIONSYNC":
updateDatabaseFromJson("QUESTIONS","QuestionDatabase",data);
break;
case "MATCHSYNC":
updateDatabaseFromJson("MatchOverview","MatchDatabase",data);
parent.setupMatches();
break;
case "CATEGORYSYNC":
updateDatabaseFromJson("categorys","QuestionDatabase",data);
break;
}
}