#java #android
#java #Android
Вопрос:
пожалуйста, помогите мне с тем, как я могу преобразовать свой класс в интерфейс, чтобы другие классы могли использовать главное меню. или дайте мне знать, есть ли простой способ вызвать то же меню в основном классе, за исключением extends bcz, поскольку есть классы, которые уже расширяют другие классы. вот пример кода
package com.droidnova.android.howto.optionmenu;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Toast;
public class ControlMenu extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@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.settings:
Intent intent = new Intent(this, ShowSettings.class);
startActivity(intent);
break;
case R.id.services:
Intent intent2 = new Intent(this, Test.class);
startActivity(intent2);
break;
case R.id.Quit:
finish();
break;
default:
break;
}
return true;
}
}
я хочу вызвать эти меню в другие классы (одно из них перечислено ниже), чтобы меню опций было доступно для каждого действия без использования extends.
public class Test extends ListActivity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.listplaceholder);
ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();
JSONObject json = JSONfunctions.getJSONfromURL("http://midsweden.gofreeserve.com/fetch.php");
try{
JSONArray earthquakes = json.getJSONArray("earthquakes");
for(int i=0;i<earthquakes.length();i ){
HashMap<String, String> map = new HashMap<String, String>();
JSONObject e = earthquakes.getJSONObject(i);
map.put("id", String.valueOf(i));
map.put("name", "Earthquake name:" e.getString("name"));
map.put("password", "Magnitude: " e.getString("password"));
mylist.add(map);
}
}catch(JSONException e) {
Log.e("log_tag", "Error parsing data " e.toString());
}
ListAdapter adapter = new SimpleAdapter(this, mylist , R.layout.test,
new String[] { "name", "magnitude" },
new int[] { R.id.item_title, R.id.item_subtitle });
setListAdapter(adapter);
final ListView lv = getListView();
lv.setTextFilterEnabled(true);
lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
@SuppressWarnings("unchecked")
HashMap<String, String> o = (HashMap<String, String>) lv.getItemAtPosition(position);
Toast.makeText(Test.this, "ID '" o.get("id") "' was clicked.", Toast.LENGTH_SHORT).show();
}
});
}
}
теперь я следую этим путем
package com.droidnova.android.howto.optionmenu;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.content.Intent;
public class MenuHandler extends Activity{
private Activity activity;
public MenuHandler(Activity activity) {
this.activity = activity;
}
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = activity.getMenuInflater();
inflater.inflate(R.menu.menu, menu);
return true;
}
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.settings:
Intent intent = new Intent(this, ShowSettings.class);
startActivity(intent);
break;
case R.id.services:
Intent intent2 = new Intent(this, Test.class);
startActivity(intent2);
break;
case R.id.Quit:
finish();
break;
default:
break;
}
return true;
}
}
и тестовый класс — это
package com.droidnova.android.howto.optionmenu;
import java.util.ArrayList;
import java.util.HashMap;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
public class Test extends ListActivity {
private MenuHandler menuHandler;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.listplaceholder);
menuHandler = new MenuHandler(this);
ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();
JSONObject json = JSONfunctions.getJSONfromURL("http://midsweden.gofreeserve.com/fetch.php");
try{
JSONArray earthquakes = json.getJSONArray("earthquakes");
for(int i=0;i<earthquakes.length();i ){
HashMap<String, String> map = new HashMap<String, String>();
JSONObject e = earthquakes.getJSONObject(i);
map.put("id", String.valueOf(i));
map.put("name", "Earthquake name:" e.getString("name"));
map.put("password", "Magnitude: " e.getString("password"));
mylist.add(map);
}
}catch(JSONException e) {
Log.e("log_tag", "Error parsing data " e.toString());
}
ListAdapter adapter = new SimpleAdapter(this, mylist , R.layout.test,
new String[] { "name", "magnitude" },
new int[] { R.id.item_title, R.id.item_subtitle });
setListAdapter(adapter);
final ListView lv = getListView();
lv.setTextFilterEnabled(true);
lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
@SuppressWarnings("unchecked")
HashMap<String, String> o = (HashMap<String, String>) lv.getItemAtPosition(position);
Toast.makeText(Test.this, "ID '" o.get("id") "' was clicked.", Toast.LENGTH_SHORT).show();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
return menuHandler.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
return menuHandler.onOptionsItemSelected(item);
}
}
меню отлично отображается на экране, но когда я нажимаю на любое меню, появляется надпись «Принудительно остановить»
Теперь я могу получать ошибки логирования, вот они
Комментарии:
1. Я не думаю, что это возможно без расширений. Я действительно не понимаю, почему вы не хотели бы его расширить?
2. что было бы в случае этого теста открытого класса, расширяющего ListActivity как я буду расширять меню управления здесь, это причина, по которой я нахожу другие способы
Ответ №1:
Что бы я сделал, так это создал специальный класс для обработки создания меню и событий и делегировал ему все. Код будет выглядеть следующим образом:
public class MenuHandler {
private Activity activity;
public MenuHandler(Activity activity) {
this.activity = activity;
}
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = activity.getMenuInflater();
inflater.inflate(R.menu.menu, menu);
return true;
}
public boolean onOptionsItemSelected(MenuItem item) {
//Handle events here
}
}
Затем, когда вам нужно иметь меню в вашем Activity
, вы создаете MenuHandler
и делегируете ему вызовы методов:
public MyActivity extends Activity {
private MenuHandler menuHandler;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
menuHandler = new MenuHandler(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
return menuHandler.onCreateOprionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
return menuHandler.onOptionsItemSelected(item);
}
}
Комментарии:
1. Конечно, нет абсолютно никакой разницы.
2. извините за этот вопрос, в тестовом классе мне нужно вызвать код, который вы указали в Myactivity, даже если он расширяется из list activity
3. Точно. В вашем случае тестовым классом будет MyActivity в моем коде.
4. Большое спасибо, Малкольм . Я попытаюсь реализовать это, и если возникнет какая-то проблема, я немного побеспокою вас
![]()
5. Привет, Малкольм. пожалуйста, помогите мне еще немного. я обновил программу, как вы сказали, но я столкнулся с проблемой, что меню отображается идеально, но когда я нажимаю на любой из всплывающих окон it force to stop
Ответ №2:
Интерфейс не имеет реализации, поэтому я не думаю, что это будет делать то, что вы хотите.
Что вы можете сделать, так это создать действие, которое расширяет ваш ControlMenu
. Это будет Activity (потому что controlmenu сам расширяет activity), и он сможет использовать код, который вы предоставили здесь. Это будет выглядеть примерно так
public class yourActivity extends ControlMenu{
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); //oncreate of controlmenu
LayoutInflater inflater = getLayoutInflater();
RelativeLayout ll = (RelativeLayout) findViewById(R.id.main);
ListView lv = (ListView) inflater.inflate(R.layout.yourlistview, ll, false);
ll.addView(lv);
lv.setAdapter(new YourAdapter(this));
}
}
и у вас будет адаптер, который выглядит как (быстрый макет)
public abstract class YourAdapter extends BaseAdapter {
final public int getCount() {}
final public Object getItem(int position) {}
final public long getItemId(int position) {}
final public void onItemClick() {}
}
Комментарии:
1. что было бы в случае этого теста открытого класса, расширяющего ListActivity как я буду расширять меню управления здесь, это причина, по которой я нахожу другие способы
2. Вы могли бы создать адаптер и использовать его для заполнения списка из Activity?
3. я подробно обновил свой вопрос с помощью кода следующего класса, который я хочу вызвать (на самом деле я не хочу снова переписывать меню). пожалуйста, проверьте это. если ваше решение работает там. дайте мне знать, чтобы я мог реализовать
4. Теперь я получаю logcat, пожалуйста, ознакомьтесь с обновленным вопросом