如何使用另一个按钮执行一个活动?
问题描述:
如何在另一个内部执行一个活动,而无需执行? 我的意思是,我有我的MainActivity其中我从ReadFromAssetActivity意图获得一些int数组。但要获得这些int数组,我需要首先执行ReadFromAssetActivity,然后转至MainActivity并执行它。 我想要的是按下MainActivity中的一个按钮,该按钮执行ReadFromAssetActivity,无需转到该活动。如何使用另一个按钮执行一个活动?
MainActivity:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Getting reference to the button btn_chart
Button btnChart = (Button) findViewById(R.id.btn_chart);
// Defining click event listener for the button btn_chart
View.OnClickListener clickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
// Draw the Chart
openChart();
}
};
// Setting event click listener for the button btn_chart of the SensorGraph layout
btnChart.setOnClickListener(clickListener);
}
private void openChart() {
Intent intent = getIntent();
int[] force_l = intent.getIntArrayExtra("force_l");
int[] force_r = intent.getIntArrayExtra("force_r");
int[] x = new int[force_l.length];
(...)
ReadFromAssetActivity:
public class ReadFromAssetActivity extends AppCompatActivity {
private Button read_Button;
int[] force_l = null;
int[] force_r = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_read_from_asset);
initializeUI();
}
private void initializeUI() {
read_Button = (Button) findViewById(R.id.ReadFromAssetActivity_start_reading_button);
read_Button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new ReadFromAsset().execute();
}
});
}
private class ReadFromAsset extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
try {
BufferedReader reader = new BufferedReader(
new InputStreamReader(getAssets().open("test.txt")));
String mLine = null;
int count = 0;
while ((mLine = reader.readLine()) != null) {
String[] integer_Strings = mLine.split(" ");
//System.out.println(Arrays.deepToString(integer_Strings));
if (count == 0) {
force_l = new int[integer_Strings.length];
for (int i = 0; i < integer_Strings.length; i++) {
force_l[i] = Integer.parseInt(integer_Strings[i]);
}
count++;
} else if (count == 1) {
force_r = new int[integer_Strings.length];
for (int i = 0; i < integer_Strings.length; i++) {
force_r[i] = Integer.parseInt(integer_Strings[i]);
}
}
}
Intent intent = new Intent(ReadFromAssetActivity.this, MainActivity.class);
intent.putExtra("force_l", force_l);
intent.putExtra("force_r", force_r);
startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
}
}
}
答
你的意图的实现几乎没有什么纯粹的Android的方式来做事。您不需要单独的'ReadFromAssetActivity'或任何其他活动来运行您的AsyncTask。最好的办法是将您的ReadFromAsset放入MainActivity中,并从openChart方法中调用。在回调界面中从AsyncTask获取int数组。
如果您的任务实际上比您在此代码段中向我们展示的方式复杂得多,请考虑为此使用IntentService的可能性。
答
让你ReadFromAsset
任务一个单独的类(不是内部类的活动),并把它存储阵列作为其“结果”。还要给任务一种记住“侦听器”的方法,以便.onPostExecute()
可以将这些数组发送回侦听器(在本例中为您的主要活动)。 我会列举一个通用示例,但我在移动设备上,并且已经有很多示例。编辑:一个例子:
/*
* This consumer could be anything -- an activity, a service, a data
* object, whatever. All it needs to do is implement the task's
* listener interface.
*/
public class Example
implements MyTask.Listener
{
// other code
public void doThings()
{
(new MyTask()).setListener(this)
.setInputFile("flargle.txt")
.execute()
;
}
/** Specified by MyTask.Listener, called by MyTask#onPostExecute() */
public void onMyTaskComplete(MyTaskResult res)
{
// Do something with the result.
}
}
public class MyTaskResult
{
// Stores whatever complex data you want the task to create.
// Necessary only if what you're creating is really complex.
}
public class MyTask extends AsyncTask<Void,Void,MyTaskResult>
{
public interface Listener
{
void onMyTaskComplete(MyTaskResult res) ;
}
protected Listener m_lstn ;
protected String m_sFilename ;
public MyTask setListener(Listener lstn)
{
m_lstn = lstn ;
return this ;
}
public MyTask setInputFile(String sFilename)
{
m_sFilename = sFilename ;
return this ;
}
@Override
public MyTaskResult doInBackground(Void... aNulls)
{
MyTaskResult res = new MyTaskResult() ;
// Do stuff that produces a MyTaskResult.
return res ;
}
@Override
public void onPostExecute(MyTaskResult res)
{
m_lstn.onMyTaskCompleted(res) ;
}
}
答
只要能使你的ReadFromAssetActivity一个公共静态方法。现在你可以在那里添加你需要的东西。您可以根据您的要求调用该方法并从主要活动执行。
那么你为什么不把你所需的代码放在'MainActivity'上? – starkshang