如何启动具有意图的类的特定实例?

时间:2017-09-26 16:28:06

标签: java android android-intent arraylist

我无法启动具有意图的类实例。

我的应用程序有一个初始屏幕,其中包含三个文本视图' Cakes,Drinks和Biscuits'。在这些文本视图上设置了一个onClick监听器,这样当用户点击“Cakes'它会转到一个蛋糕列表(巧克力,柠檬,胡萝卜),用户点击“饮料”#39;它列出了饮料(茶,咖啡,可乐),以及饼干的相同。目前,我有一个启动Cakes类的意图,并且在该类中有一个包含字符串(Chocolate,Lemon,Carrot等)的arrayList,当用户点击Drinks时,它会启动一个名为Drinks的单独类,并执行相同的操作,与饼干同上。但是,我认为更好的编码实践是只为这三个类提供一个类,并且具有该类的单独实例(使用不同的arrayLists分别列出蛋糕,饮料和饼干)。

我认为我应该制作一个'项目' class(即带有巧克力,柠檬,胡萝卜和所有饮料的arrayList,以及所有饼干),但不知道如何启动'项目的特定实例。我的意图写在mainActivity中的类。任何帮助表示赞赏!

mainActivity.java列出了最初的三个项目:

package com.example.android.recipe;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    TextView history = (TextView) findViewById(R.id.cakes);
    history.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent cakesList = new Intent(MainActivity.this, cakeActivity.class);
            startActivity(cakesList);
        }
    });

    TextView examination = (TextView) findViewById(R.id.drinks);
    examination.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent drinksIntent = new Intent(MainActivity.this, drinksActivity.class);
            startActivity(drinksIntent);
        }
    });

    TextView other = (TextView) findViewById(R.id.biscuits);
    other.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent biscuitsIntent = new Intent(MainActivity.this, BiscuitsActivity.class);
            startActivity(biscuitsIntent);
        }
    });

    }
}

这是' CakeActivity.java'当你点击“Cakes'”时会启动它,我想把它变成一个通用类,当你点击Cakes,Coffee或Biscuits时会启动它,但它会提供相关的ArrayList。注意我有一个名为' Record'的自定义ArrayAdapter。因为,当我进一步开发这个应用程序时,点击巧克力,柠檬等将有一个制作蛋糕所需的单独成分列表(这些将来也不会是单独的类)。

package com.example.android.recipe;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;

import java.util.ArrayList;

public class cakeActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.record_list);

        final ArrayList<Record> records = new ArrayList<Record>();

        records.add(new Record("Chocolate", ChocolateCake.class));
        records.add(new Record("Lemon", LemonCake.class));
        records.add(new Record("Ginger", GingerCake.class));

        RecordAdapter adapter =
                new RecordAdapter(this, records, R.color.colorTan);
        ListView listView = (ListView) findViewById(R.id.list);
        listView.setAdapter(adapter);

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Record record = records.get(position);
                Intent intent = new Intent(getApplicationContext(), record.getListedItemId());
                startActivity(intent);
            }
            });



    }
}

注意这是示例代码,而不是我的实际应用程序 - 我提到这个的原因是因为我将有一个非常长的列表,在我的代码当前编写的方式中,需要> 100个类如果我按照我上面的方式继续。

1 个答案:

答案 0 :(得分:0)

您可以使用意图额外值:

最简单的方法是将类型传递给intent中的活动。

Intent intent = new Intent(getBaseContext(), AllInOneActivity.class);
intent.putExtra("type", "cake");
startActivity(intent);

访问下一个活动的意图

String type = getIntent().getStringExtra("type");

根据类型加载您的数据:

final ArrayList<Record> records = new ArrayList<Record>();
if(type.equals("cake"))
{
        records.add(new Record("Chocolate", ChocolateCake.class));
        records.add(new Record("Lemon", LemonCake.class));
        records.add(new Record("Ginger", GingerCake.class));
}
else if(type.equals("Drinks"))
{
records.add(new Record("fruty", whatever.class));
}

试试这个并告诉我。如果问题仍然存在