2017-04-05 67 views
-1

我试图在选择子活动中的弹出菜单中的项目时更改主要活动的背景颜色。但是,当我运行该应用程序并选择所述项目时,该应用程序崩溃。这是次活动代码:选择弹出菜单项目时发送意图

public class Modify extends AppCompatActivity { 
Button button, submit; 
EditText edit; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.modify); 
    button = (Button) findViewById(R.id.button); 
    submit = (Button) findViewById(R.id.submit); 
    edit = (EditText) findViewById(R.id.editText); 

    button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      PopupMenu pop = new PopupMenu(Modify.this, button); 
      pop.getMenuInflater().inflate(R.menu.menu,pop.getMenu()); 
      pop.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener(){ 
       @Override 
       public boolean onMenuItemClick(MenuItem item){ 
        Intent i = new Intent(Modify.this, MainActivity.class); 
        switch (item.getItemId()){ 
         case R.id.red: 
          i.putExtra("color","red"); 
          break; 

         //TODO add more colours 

         default: 
          return false; 

        } 
        return true; 
       } 
      }); 

      pop.show(); 
     } 
    }); 


    submit.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      String message = edit.getText().toString(); 
      Intent intent = new Intent(); 
      intent.putExtra("MESSAGE", message); 
      setResult(2, intent); 
      finish(); 
     } 

    }); 

    } 
} 

我真的不知道,如果在每一种情况下,我宣布的意图实际上是让回changeBackground方法的主要活动:

public class MainActivity extends AppCompatActivity { 
//GLOBALS 
TextView txt; 
Button btn; 
RelativeLayout rel; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    txt = (TextView) findViewById(R.id.Text); 
    btn = (Button) findViewById(R.id.Btn); 
    rel = (RelativeLayout) findViewById(R.id.activity_main); 

    Intent intent = getIntent(); 
    String color = intent.getStringExtra("color"); 
    changeBackground(color); 


    btn.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      //ON CLICK SETS INTENT 
      Intent intent = new Intent(MainActivity.this, Modify.class); 

      //INTENT STARTS ACTIVITY 2 
      startActivityForResult(intent, 2); 
     } 
    }); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (requestCode == 2) { 
     //SET TEXT WHEN RESULT IS ACCEPTED 
     String message = data.getStringExtra("MESSAGE"); 
     txt.setText(message); 

    } 

} 

public void changeBackground(String color) { 

    if (color.equals("red")) { 
     rel.setBackgroundColor(Color.RED); 
    } else if (color.equals("green")) { 
     rel.setBackgroundColor(Color.GREEN); 
    } else if (color.equals("blue")) { 
     rel.setBackgroundColor(Color.BLUE); 
    } 
    } 
} 
+1

你的'startActivityForResult()'在哪里?显示logcat – tahsinRupam

+0

我有一个startActivityForResult()文本额外。然而,我可以用一个子活动的意图来设置主活动的背景颜色,这个子活动会发送额外的东西作为changeBackground方法的参数传递吗? –

+0

请在下面检查我的答案。 – tahsinRupam

回答

0

刚使用startActivityforResult(intent);

+0

我可能误解了我的问题。我试图用弹出菜单中的每个项目的意图设置主要活动的颜色,同时还从单独的按钮发送额外的文本作为onActivityResult。这两个视图都是在您修改主要活动外观的子活动中。 –

0

试试下面的代码:

botton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      PopupMenu pop = new PopupMenu(Modify.this, botton); 
      pop.getMenuInflater().inflate(R.menu.menu,pop.getMenu()); 
      pop.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener(){ 
       @Override 
       public boolean onMenuItemClick(MenuItem item){ 
        Intent i = new Intent(Modify.this, MainActivity.class); 

        switch (item.getItemId()){ 
         case R.id.red: 
          i.putExtra("color","red");                
          break; 

         case R.id.magenta: 
          i.putExtra("color","magenta");       
          break; 

         default: 
          return false; 
        } 

        startActivity(i); 
        finish(); 

        return true; 
       } 
      });      
      pop.show(); 
     } 
    }); 

MainActivityonCreate()

String color = getIntent().getStringExtra("color", "red"); 
    if (color.equals("red")) { 
     rel.setBackgroundColor(Color.RED); 
    } else if (color.equals("green")) { 
     rel.setBackgroundColor(Color.GREEN); 
    } else if (color.equals("blue")) { 
     rel.setBackgroundColor(Color.BLUE); 
    } 

希望这有助于。

+0

我很感激这个帮助,但它在启动时崩溃。出于某种原因,只要我对第二个代码段进行切换评论,它就会正常运行,但对于我选择项目时没有任何操作。 –

+0

1)您是否将'onMenuItemClick'更改为'return true'? 2)你在哪里添加了第二个代码片段?它应该在setContentView之后的'onCreate()'中。请检查你正在收到什么错误 – tahsinRupam

+0

是的。我也有一个单独的onActivityResult主要活动收到一个额外的文本。也许我不能混用这两种意图。 –

0

解决了,有点粗暴:

子活动:

public class Modify extends AppCompatActivity { 
Button button, submit; 
EditText edit; 
String s; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.modify); 
    button = (Button) findViewById(R.id.button); 
    submit = (Button) findViewById(R.id.submit); 
    edit = (EditText) findViewById(R.id.editText); 

    button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      PopupMenu pop = new PopupMenu(Modify.this, boton); 
      pop.getMenuInflater().inflate(R.menu.menu, pop.getMenu()); 
      pop.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { 

       @Override 
       public boolean onMenuItemClick(MenuItem item) { 

        switch(item.getItemId()){ 

         case R.id.red: 
          s="red"; 
          return true; 

         case R.id.green: 
          s="green"; 
          return true; 

         case R.id.blue: 
          s="blue"; 
          return true; 

         case R.id.yellow: 
          s="yellow"; 
          return true; 

         case R.id.magenta: 
          s="magenta"; 
          return true; 

         default: 
          return false; 
        } 
       } 
      }); 
      pop.show(); 
     } 

    }); 


    submit.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent i = new Intent(Modify.this,MainActivity.class); 
      String message = edit.getText().toString(); 
      String colorMessage = s; 
      i.putExtra("MESSAGE", message); 
      i.putExtra("COLOR", colorMessage); 
      setResult(2,i); 
      finish(); 
     } 

    }); 

    } 

} 

主要活动:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    txt = (TextView) findViewById(R.id.Text); 
    btn = (Button) findViewById(R.id.Btn); 
    rel = (RelativeLayout) findViewById(R.id.activity_main); 

    btn.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent intent = new Intent(MainActivity.this, Modify.class); 
      startActivityForResult(intent,2); 

     } 
    }); 

} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    super.onActivityResult(requestCode, resultCode, data); 
    if(requestCode==2) 
    { 

     String message=data.getStringExtra("MESSAGE"); 
     txt.setText(message); 
     String color = data.getStringExtra("COLOR"); 
     changeBackground(color); 
    } 
} 
public void changeBackground(String color) { 
    if (color.equals("red")) { 
     rel.setBackgroundColor(Color.RED); 
    } else if (color.equals("green")) { 
     rel.setBackgroundColor(Color.GREEN); 
    } else if (color.equals("blue")) { 
     rel.setBackgroundColor(Color.BLUE); 
    } else if (color.equals("yellow")) { 
     rel.setBackgroundColor(Color.YELLOW); 
    } else if (color.equals("magenta")) { 
     rel.setBackgroundColor(Color.MAGENTA); 
    } 
} 

} 

请让我知道如果有一个更优雅的方式来获得的颜色开关盒不必将它们分配给它们中的每一个变量。

Cheers

相关问题