Android 没有finish()方法,活动切换无法工作

Android 没有finish()方法,活动切换无法工作,android,Android,我的代码如下所示: TableActivity.java public class TableActivity extends AppCompatActivity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_ta

我的代码如下所示:

TableActivity.java

public class TableActivity extends AppCompatActivity {

 @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_table_selection);
        itemName = (TextView) findViewById(R.id.itemName);
        foodMenuLayout = (LinearLayout) findViewById(R.id.foodMenuLayout);
        drinkMenuLayout = (LinearLayout) findViewById(R.id.drinksMenuLayout);
        tableNo = (TextView) findViewById(R.id.tableNo);
        foodMenu = (TextView) findViewById(R.id.foodMenu);
        drinksMenu = (TextView) findViewById(R.id.drinksMenu);
        tapLayout = (LinearLayout) findViewById(R.id.tapLayout);
        foodImage = (ImageView) findViewById(R.id.foodImage);
        drinkImage = (ImageView) findViewById(R.id.drinkImage);

        getFoodTruckInfo();

        tapLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                tableList = TableList.getInstance(MyCart.getInstance().getTableNo());
                tableList.setItemListener(TableActivity.this);
                tableList.setCancelable(false);
                tableList.show(getSupportFragmentManager(), null);
            }
        });

        setFontStyle();

        foodMenuLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (TextUtils.isEmpty(tableNo.getText().toString().trim())) {
                    Toast.makeText(TableActivity.this, "Please select table", Toast.LENGTH_SHORT).show();
                } else {
                    lauchItemActivity();
                }
            }
        });

        drinkMenuLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (TextUtils.isEmpty(tableNo.getText().toString().trim())) {
                    Toast.makeText(TableActivity.this, "Please select table", Toast.LENGTH_SHORT).show();
                } else {
                    lauchDrinksActivity();
                }
            }
        });
    }

    private void lauchItemActivity() {
        FoodtruckInfo foodtruckInfo = new FoodtruckInfo();
        foodtruckInfo.setFoodTruckName(foodTruck.getFoodTruckName());
        foodtruckInfo.setFoodTruckImage(foodTruck.getFoodTruckLogo());
        foodtruckInfo.setFoodTruckId(foodTruck.getFoodTruckId());
        foodtruckInfo.setOrderStatus(foodTruck.getFoodTruckOpenStatus());
        Intent intent = new Intent(TableActivity.this, FoodTruckItemsActivity.class);
        intent.putExtra(Consts.FOODTRUCK_INFO, foodtruckInfo);
        intent.putExtra(Consts.IS_SEARCH, false);
        intent.putExtra(Consts.IS_DRINKS, false);
        intent.putParcelableArrayListExtra(Consts.FOODTRUCK_ITEM, (ArrayList<? extends Parcelable>) foodTruck.getFoodTruckItemList());

        startActivityForResult(intent, Consts.ITEMS_ACTIVITY);
    }


    private void lauchDrinksActivity() {
        FoodtruckInfo foodtruckInfo = new FoodtruckInfo();
        foodtruckInfo.setFoodTruckName(foodTruck.getFoodTruckName());
        foodtruckInfo.setFoodTruckImage(foodTruck.getFoodTruckLogo());
        foodtruckInfo.setFoodTruckId(foodTruck.getFoodTruckId());
        foodtruckInfo.setOrderStatus(foodTruck.getFoodTruckOpenStatus());
        Intent intent = new Intent(TableActivity.this, FoodTruckDrinksActivity.class);
        intent.putExtra(Consts.FOODTRUCK_INFO, foodtruckInfo);
        intent.putExtra(Consts.IS_SEARCH, false);
        intent.putExtra(Consts.IS_DRINKS, true);
        intent.putParcelableArrayListExtra(Consts.FOODTRUCK_ITEM, (ArrayList<? extends Parcelable>) foodTruck.getFoodTruckDrinkList());
        startActivityForResult(intent, Consts.DRINKS_ACTIVITY);
    }
@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == Activity.RESULT_OK) {
            if (requestCode == Consts.ITEMS_ACTIVITY) {
                lauchDrinksActivity();
            } else if (requestCode == Consts.DRINKS_ACTIVITY) {
                lauchItemActivity();
            }
        }
    }
}
public class FoodTruckItemsActivity extends AppCompatActivity implements
        FoodTruckItemsAdapter.OnItemClickListener, FoodTruckItemFragment.FoodTruckItemListener,
        ViewPager.OnPageChangeListener, View.OnClickListener {


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

 routeView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                routeToAnotherMenu();
            }
        });
    }

 private void routeToAnotherMenu() {
        setResult(Activity.RESULT_OK);

    }
}
FoodTruckItemsActivity.javaFoodTruckDrinksActivity.java是相同的。因此,这里我想要的是,如果我按下
routeView
,它应该从
FoodTruckItemsActivity.java
切换到
FoodTruckDrinksActivity.java
,反之亦然。 为此,我编写了
routeToAnotherMenu()
方法。现在的问题是,如果我不在
routeToAnotherMenu
中编写
finish()
,它就不会加载另一个活动。但是如果我在
setResult()之后写入finish()
,那么它就可以完美地工作

我不喜欢在该方法中使用finish()的主要原因是它会擦除数据。那么,有没有什么方法可以不用编写finish()方法就可以做到这一点呢

在启动另一个活动之前,或者如果希望启动此活动的活动在退出(调用finish)后收集结果,则应使用setResult()

我可以想象两种方法来实现你想要的结果:

1) 将finish()之后要保存的“数据”(例如,转换为单例)与当前活动解耦。 如果FoodTruckItemsActivity.java和FoodTruckDrinksActivity.java几乎相同,那么它们应该从一个公共父级继承,这样您就可以轻松地完成这项工作。 这也更好,因为“TableActivity”每次都会启动一个新的意图,所以不调用finish是无用的

2) 您还可以更改将FoodRuckItemsActivity和FoodRuckDrinksActivity转换为片段的方法,将它们交换到“TableActivity”的片段容器中,并将数据共享到活动中。

在启动另一个活动之前应使用setResult(),或者,如果希望启动此活动的活动在退出后收集结果(调用finish)

我可以想象两种方法来实现你想要的结果:

1) 将finish()之后要保存的“数据”(例如,转换为单例)与当前活动解耦。 如果FoodTruckItemsActivity.java和FoodTruckDrinksActivity.java几乎相同,那么它们应该从一个公共父级继承,这样您就可以轻松地完成这项工作。 这也更好,因为“TableActivity”每次都会启动一个新的意图,所以不调用finish是无用的

2) 您还可以更改将FoodRuckItemsActivity和FoodRuckDrinksActivity转换为片段的方法,将它们交换到“TableActivity”的片段容器中,并将数据共享到活动中。

来自以下文档:

启动的活动退出时调用(…)

仅设置结果不会导致调用该方法

如果你想在屏幕间自由切换,也许你应该考虑从文档中使用片段<

启动的活动退出时调用(…)

仅设置结果不会导致调用该方法


如果你想在屏幕之间自由切换,也许你应该考虑使用片段?

在你的情况下,<强>食物活动> <强>是从你打开<强>食物活动> <强> >的共同活动。

现在,例如,在TableActivity中声明ArrayList以将所有选定数据存储在该ArrayList中

现在,当您为FoodTruckItemsActivity启动TactivityForresult()时。在FoodTruckItemsActivity中声明用于添加数据的ArrayList。现在,当你转到另一个菜单时,写下这个

Intent intent=new Intent();  
intent.putStringArrayList("FOODITEMLIST", myItemList);  
setResult(intent);  
finish();
现在,在表活动中,结果出现在onActivityResult中

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == Activity.RESULT_OK) {
        if (requestCode == Consts.ITEMS_ACTIVITY) {
            // Get the arraylist and add that list in Table Activity Main ArrayList 
            // which we declare earlier in Table Activity.
            lauchDrinksActivity();
        } else if (requestCode == Consts.DRINKS_ACTIVITY) {
            lauchItemActivity();
        }
    }
}

在您的情况下,FoodTruckItemActivity是打开FoodTruckDrinkActivity的常见活动

现在,例如,在TableActivity中声明ArrayList以将所有选定数据存储在该ArrayList中

现在,当您为FoodTruckItemsActivity启动TactivityForresult()时。在FoodTruckItemsActivity中声明用于添加数据的ArrayList。现在,当你转到另一个菜单时,写下这个

Intent intent=new Intent();  
intent.putStringArrayList("FOODITEMLIST", myItemList);  
setResult(intent);  
finish();
现在,在表活动中,结果出现在onActivityResult中

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == Activity.RESULT_OK) {
        if (requestCode == Consts.ITEMS_ACTIVITY) {
            // Get the arraylist and add that list in Table Activity Main ArrayList 
            // which we declare earlier in Table Activity.
            lauchDrinksActivity();
        } else if (requestCode == Consts.DRINKS_ACTIVITY) {
            lauchItemActivity();
        }
    }
}

也发布清单文件,说明您使用startActivityForResult()的原因;而您可以使用startActivity();,通过简单的方式调用它@AniruddhParihar我想追踪activity@MrugeshThaker如果不编写finish(),它将不允许转到以前的活动。让我知道foodruckitemsacity包含数据的一件事,对吗?所以您想在TableActivity中使用该数据,是吗?让我know@AndyDeveloper我在FoodTruckItemActivity.java中添加了一些项目。现在,如果我从FoodTruckItemActivity.java切换到FoodTruckDrinkActivity.java,然后再次从FoodTruckDrinkActivity.java切换到FoodTruckItemsActivity.java,我应该会看到这些项目添加到FoodTruckItemActivity.javaPost您的清单文件中,以及您使用startActivityForResult()的原因;而您可以使用startActivity();,通过简单的方式调用它@AniruddhParihar我想追踪activity@MrugeshThaker如果不编写finish(),它将不允许转到以前的活动。让我知道一件事FoodTruckItemsActivity包含正确的数据,所以您想在TableActivity中使用该数据,是吗?让我know@AndyDeveloper我在FoodTruckItemActivity.java中添加了一些项目。现在,如果我从FoodTruckItemActivity.java切换到FoodTruckDrinkActivity.java,然后再次从FoodTruckDrinkActivity.java切换到FoodTruckItemsActivity.java,我应该会看到那些添加到FoodTruckItemActivity.java中的项目