【问题标题】:Buttons switch-case statement inside Protected VoidProtected Void 中的按钮 switch-case 语句
【发布时间】:2017-08-01 19:30:00
【问题描述】:

我正在我的 Android 应用程序中从 API 获取数据,并在活动之间将其传输到 bundle

OnPostExectute 中,我创建了一组 JSON datatitle,它们显示在我的第二个活动中。

现在我想使用switch-case 语句,以便当点击button 时,我从正确的API 获取数据 并在bundle 中传输正确的标题。

我已将xml 文件中的OnClick 函数分配给我的按钮。

任何人都可以为我指出正确的方向吗?

我可以将public voidSwitch Case 语句放在Protected Void (OnPostExecute) 中吗?因为它似乎不起作用。

如果有人可以查看我的代码并就其结构给我一些提示,我将不胜感激。

下面是我的PostExecute 代码:

@Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);

    public void btnHelp(View v) {
        Button clickedButton = (Button) v;
        switch (clickedButton.getId()) {
            case R.id.btnHousing:
                String activity_title = getResources().getString(R.string.title2);
                Intent intent = new Intent(MainActivity.this, DisplayDataActivity.class);
                Bundle extras = new Bundle();
                extras.putString("title", activity_title);
                extras.putString("JSON_Object", result);
                intent.putExtras(extras);
                startActivity(intent);
                break;

            case R.id.btnFood:
                String activity_title = getResources().getString(R.string.title1);
                Intent intent = new Intent(MainActivity.this, DisplayDataActivity.class);
                Bundle extras = new Bundle();
                extras.putString("title", activity_title);
                extras.putString("JSON_Object", result);
                intent.putExtras(extras);
                startActivity(intent);
                break;
        }

    }
}

下面是我的 .java 按钮:

public void btnHelp1(View view) {
    JSONTask objJSONTask=new JSONTask(MainActivity.this);
    objJSONTask.execute("URL_with_API_1");
}

public void btnHelp2(View view) {

    JSONTask objJSONTask=new JSONTask(MainActivity.this);
    objJSONTask.execute("URL_with_API_2");
}

这是我的两个按钮的 .xml 文件:

<Button
        android:text="@string/text1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"     
        android:onClick="btnHelp"
        android:id="@+id/btnHousing"
        />
    <Button
        android:text="@string/text2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="btnHelp"
        android:id="@+id/btnFood"
        />

【问题讨论】:

标签: java android switch-statement


【解决方案1】:

请试试这个...

1. activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">

<Button
    android:text="@string/text1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="onHouse"
    android:id="@+id/btnHousing"
    />
<Button
    android:text="@string/text2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="onFood"
    android:layout_below="@+id/btnHousing"
    android:id="@+id/btnFood"
    />

2。 OnTaskCompleted.java

public interface OnTaskCompleted {
   public void onTaskOne(String result);
   public void onTaskTwo(String result);
}

3.常量.java

public class Constants {
  public static final int URL_with_API_1 = 1;
  public static final int URL_with_API_2 = 2;
}

4. JSONTask.java

    public class JSONTask extends AsyncTask<String, Void, String> {
       private OnTaskCompleted mOnTaskCompleted;
       private int apiType = 0;

       public JSONTask(int apiType, OnTaskCompleted mOnTaskCompleted) {
         this.apiType = apiType;
         this.mOnTaskCompleted = mOnTaskCompleted;
       }

      @Override
      protected void onPreExecute() {
        super.onPreExecute();
      }

      @Override
      protected String doInBackground(String... params) {
          String api = params[0];

          // make rest call and return valid data to onPostExecute callback.
          return null;
      }

      @Override
      protected void onPostExecute(String result) {
           super.onPostExecute(result);

           //Magic...
           switch (apiType) {
               case Constants.URL_with_API_1:
                    if (mOnTaskCompleted != null) mOnTaskCompleted.onTaskOne(result);
                 break;
               case Constants.URL_with_API_2:
                    if (mOnTaskCompleted != null) mOnTaskCompleted.onTaskTwo(result);
                 break;
              default:
            }
          }
        }

5. MainActivity.java

public class MainActivity extends AppCompatActivity {

private String JSON_RESULT_API_1 = "";
private String JSON_RESULT_API_2 = "";
private JSONTask mJsonTask;

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

    //make api 1
    mJsonTask = new JSONTask(Constants.URL_with_API_1, mOnTaskCompleted);
    mJsonTask.execute("URL_with_API_1");

    //make api 2
    mJsonTask = new JSONTask(Constants.URL_with_API_2, mOnTaskCompleted);
    mJsonTask.execute("URL_with_API_2");

}

public void onHouse(View view) {
    String activity_title = getResources().getString(R.string.title2);
    Intent intent = new Intent(MainActivity.this, DisplayDataActivity.class);
    Bundle extras = new Bundle();
    extras.putString("title", activity_title);
    extras.putString("JSON_Object", JSON_RESULT_API_1);
    intent.putExtras(extras);
    startActivity(intent);
}

public void onFood(View view) {
    String activity_title = getResources().getString(R.string.title1);
    Intent intent = new Intent(MainActivity.this, DisplayDataActivity.class);
    Bundle extras = new Bundle();
    extras.putString("title", activity_title);
    extras.putString("JSON_Object", JSON_RESULT_API_2);
    intent.putExtras(extras);
    startActivity(intent);
}


  OnTaskCompleted mOnTaskCompleted = new OnTaskCompleted() {
    @Override
    public void onTaskOne(String result) {
        JSON_RESULT_API_1 = result;
    }

    @Override
    public void onTaskTwo(String result) {
        JSON_RESULT_API_2 = result;
    }
    };
    }

【讨论】:

  • 非常感谢您的回答亲爱的朋友!我试图实现代码,但是 AndroidStudio 下划线了“公共接口 OnTaskCompleted”函数给我以下错误:“内部类不能有静态声明”。你知道为什么会这样吗?非常感谢您的帮助!
  • 嗨!它是我 JSONTask.java 中的“公共接口 OnTaskCompleted”:(
  • 绝对会的!再次感谢你!如果不是太麻烦,你介意他们解释一下你在代码中使用了什么样的逻辑吗?因为我真的很想为 android 学习 Java,它看起来与我所知道的 Python 大不相同。对不起,我要求这么多!再次感谢朋友!
  • 我试图将您的代码扩展到 13 个按钮,但我不明白什么是“private int apiType = 0;”在 JSONTask 中。您能否向我解释一下我需要将其更改为多少才能添加另外 11 个按钮? (我按照您的方法添加了其他按钮和功能)。我会很感激。谢谢!!
  • 您是对 13 个按钮发出不同的 api 请求还是相同的 api 请求?如果是,您总共调用了多少个 api?
猜你喜欢
  • 1970-01-01
  • 2013-09-24
  • 2021-06-13
  • 1970-01-01
  • 1970-01-01
  • 2016-01-18
  • 2015-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多