2012-03-18 3 views
2

В моей основной деятельности я определил два вида и меню:Как использовать Android Invalidate()

Просмотров: 1. Пользовательского вида игры 2. Кнопка BTN

Меню: 1. Открыть пункт для открытия файла

компоновка меню определяется в различной активности

в основном, когда начинается основная деятельность, она тащит пользовательский вид, что не имеет ничего, и кнопку. Затем я загружаю файл, открывая его в меню. Он отображает список файлов в каталоге/sdcard, и я выбираю файл из списка. Затем onListItemClick() анализирует файл и обновляет структуру данных в пользовательском представлении. Затем я возвращаюсь назад, чтобы вернуться к основному действию. Теперь я ожидаю увидеть перерисовку после нажатия кнопки, но, похоже, ничего не делает. Я внедрил OnClickListener() для кнопки и вызываю игру.invalidate(). Но это не похоже на перерисовку пользовательского представления сразу после нажатия кнопки. Мне нужно выйти из приложения (кнопка «Назад»), а затем снова открыть приложение, чтобы увидеть перерисовку. Я прочитал другие сообщения о недействительности(), не перерисовывая представление сразу. Он только подталкивает его к очереди, и Android будет действовать, как только это будет доступно. Я думаю, что я не понимаю, что в моем приложении Android держится за действия.

Отрывки кода

//Main Activity 
public class someActivity extends Activity { 

someView myView; 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    LinearLayout layout = new LinearLayout(this); 
    layout.setOrientation(LinearLayout.VERTICAL); 
    Button btn1 = new Button(this); 
    btn1.setOnClickListener(forward); 
    myView = new someView(this); 
    layout.addView(myView); 
    layout.addView(btn1); 
    setContentView(layout); 
} 
@Override 
public boolean onCreateOptionsMenu(Menu menu) 
{ 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.menu, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) 
{ 
    switch (item.getItemId()) 
    { 
    case R.id.open: 
     Intent myIntent = new Intent(); 
     myIntent.setClass(this, DirectoryBrowser.class); 
     startActivityForResult(myIntent,0); 
     return true; 
    case R.id.save: 
     return true; 
    default: 
     return super.onOptionsItemSelected(item); 

    } 
} 

private OnClickListener forward = new OnClickListener() 
{ 
    public void onClick(View v) 
    { 
     myView.invalidate(); 

    } 
}; 

//DirectoryBrowser Activity 
public class DirectoryBrowser extends ListActivity 
{ 
private List<String> items = null; 

@Override 
public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    setContentView(R.layout.open); 
    getFiles(new File("/sdcard").listFiles()); 
} 

@Override 
protected void onListItemClick(ListView l, View v, int position, long id){ 
    int selectedRow = (int)id; 
    if(selectedRow == 0){ 
     getFiles(new File("/sdcard").listFiles()); 
    }else{ 
     File file = new File(items.get(selectedRow)); 
     if(file.isDirectory()){ 
      getFiles(file.listFiles()); 
     }else{ 
       try 
       { 
             //Parse file and update myView.data 
            } 
       catch (FileNotFoundException e) 
       { 
        Log.e("ERROR","File Not Found"); 
       } 
     } 
    } 
} 

//Custom View someView 
//... 

@Override 
public void onDraw(Canvas canvas) 
{ 
     //Redraw view here 

} 
+0

Вы получили решение? – ViVekH

ответ

6

Я видел 2 мероприятия, так что я думаю postInvalidate() может это то, что вы ищете.

http://developer.android.com/reference/android/view/View.html#invalidate%28%29 http://developer.android.com/reference/android/view/View.html#postInvalidate%28%29

Edit: Why isn't view.invalidate immediately redrawing the screen in my android game здесь есть нить интересную, вы видели его?

+0

Я вызываю invalidate() в том же самом действии, где находится пользовательский вид. Поэтому мне, вероятно, не нужен postInvalidate(). Поправьте меня, если я ошибаюсь. – kvzrock

+0

опубликовал ссылку из StackOverflow. метод repaint() выглядит интересным. – sschrass

0

Вместо myView.invalidate() попробуйте v.invalidate(), потому что я думаю, что ваше представление кнопки будет передано как параметр методу onclick().

Смежные вопросы