【问题标题】:Make visible and invisible imageView by a button通过按钮使 imageView 可见和不可见
【发布时间】:2016-12-31 20:48:30
【问题描述】:

我有三个活动,每个活动都有一个按钮。 Act1btn1Act2btn2 以及 Act3btn3 。我有另一个作为 MainActivity 的 Activity,带有三个 imageView:ImageView1imageView2imageView3,所有这些最初都是不可见的。我想要它,所以当我在 act1 中单击 btn1 时,MainActivity 中的 imageView1 将可见,当再次单击 btn1 时,imageView1 将再次不可见。 imageView2imageView3 也是如此。 到目前为止我有这个代码:

Activity1

public class Activity1 extends AppCompatActivity{

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

Button btn1 = (Button) findViewById(R.id.btn1);
btn1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        String visibilityStr = PublicSharedPreferences.getDefaults("keyVisibility", getApplicationContext());

        if (visibilityStr != null) {
            if (visibilityStr.equals("0")) {
                Toast.makeText(act1.this, "it visibled", Toast.LENGTH_SHORT).show();
                visibilityStr = "1";
btn1.setImageResource(R.mipmap.img1);

            } else {
                visibilityStr = "0";
                Toast.makeText(act1.this, "it invisibled", Toast.LENGTH_SHORT).show();
btn1.setImageResource(R.mipmap.img2);

            }
        } else {
            visibilityStr = "1";
            Toast.makeText(act1.this, "it visibled", Toast.LENGTH_SHORT).show();
btn1.setImageResource(R.mipmap.img1);

        }

        PublicSharedPreferences.setDefaults("keyVisibility", visibilityStr, getApplicationContext());

    }
});
}





Activity2

public class Activity2 extends AppCompatActivity{

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


Button btn1 = (Button) findViewById(R.id.btn2);
btn1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        String visibilityStr = PublicSharedPreferences.getDefaults("keyVisibility", getApplicationContext());

        if (visibilityStr != null) {
            if (visibilityStr.equals("0")) {
                Toast.makeText(act2.this, "it visibled", Toast.LENGTH_SHORT).show();
btn2.setImageResource(R.mipmap.img1);

                visibilityStr = "1";
            } else {
                visibilityStr = "0";
                Toast.makeText(act2.this, "it invisibled", Toast.LENGTH_SHORT).show();
btn2.setImageResource(R.mipmap.img2);

            }
        } else {
            visibilityStr = "1";
            Toast.makeText(act2.this, "it visibled", Toast.LENGTH_SHORT).show();
btn2.setImageResource(R.mipmap.img1);

        }

        PublicSharedPreferences.setDefaults("keyVisibility", visibilityStr, getApplicationContext());

    }
});
}



Activity3

public class Activity3 extends AppCompatActivity{

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

Button btn1 = (Button) findViewById(R.id.btn3);
btn1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        String visibilityStr = PublicSharedPreferences.getDefaults("keyVisibility", getApplicationContext());

        if (visibilityStr != null) {
            if (visibilityStr.equals("0")) {
                Toast.makeText(act3.this, "it visibled", Toast.LENGTH_SHORT).show();
Btn3.setImageResource(R.mipmap.img1);

                visibilityStr = "1";
            } else {
                visibilityStr = "0";
                Toast.makeText(act3.this, "it invisibled", Toast.LENGTH_SHORT).show();
btn3.setImageResource(R.mipmap.img2);

            }
        } else {
            visibilityStr = "1";
            Toast.makeText(act3.this, "it visibled", Toast.LENGTH_SHORT).show();
btn3.setImageResource(R.mipmap.img1);

        }

        PublicSharedPreferences.setDefaults("keyVisibility", visibilityStr, getApplicationContext());
    }
});
}

带有三个imageViews的MainActivity:

    ImageView imgView1 = (ImageView) findViewById(R.id.imgView1);
String visibilityStr= PublicSharedPreferences.getDefaults("keyVisibility", getApplicationContext());

if (visibilityStr.equals("0"))
    imgView1.setVisibility(View.INVISIBLE);
else
    imgView1.setVisibility(View.VISIBLE);


ImageView imgView2 = (ImageView) findViewById(R.id.imgView2);
String visibilityStr= PublicSharedPreferences.getDefaults("keyVisibility", getApplicationContext());

if (visibilityStr.equals("0"))
    imgView2.setVisibility(View.INVISIBLE);
else
    imgView2.setVisibility(View.VISIBLE);



ImageView imgView3 = (ImageView) findViewById(R.id.imgView3);
String visibilityStr= PublicSharedPreferences.getDefaults("keyVisibility", getApplicationContext());

if (visibilityStr.equals("0"))
    imgView3.setVisibility(View.INVISIBLE);
else
    imgView3.setVisibility(View.VISIBLE);

他们运作良好。但问题是,当我点击btn1 时,MainActivity 中的所有imageViews 都会发生变化(变得可见或不可见),或者当我点击btn3 时,所有imageViews 都会发生变化。我想要它,所以 btn1 只是改变 imageView1btn2 只是改变 imageView2btn3只需更改 imageView3,而不是更改所有 imageViews 的按钮之一。我怎样才能做到这一点?代码哪一部分错了?

【问题讨论】:

    标签: java android


    【解决方案1】:

    问题是您只有 1key Preference 它的所有 keyVisibility 所以当您单击任何按钮时,此键会根据您的代码更改为 1 或 0

    这里

    ImageView imgView1 = (ImageView) findViewById(R.id.imgView1);
    String visibilityStr1= PublicSharedPreferences.getDefaults("keyVisibility1", getApplicationContext());
    
    if (visibilityStr1.equals("0"))
        imgView1.setVisibility(View.INVISIBLE);
    else
        imgView1.setVisibility(View.VISIBLE);
    
    
    ImageView imgView2 = (ImageView) findViewById(R.id.imgView2);
    String visibilityStr2= PublicSharedPreferences.getDefaults("keyVisibility2", getApplicationContext());
    
    if (visibilityStr2.equals("0"))
        imgView2.setVisibility(View.INVISIBLE);
    else
    imgView2.setVisibility(View.VISIBLE);
    
    
    
    ImageView imgView3 = (ImageView) findViewById(R.id.imgView3);
    `String visibilityStr3= PublicSharedPreferences.getDefaults("keyVisibility3",` `getApplicationContext());`
    
    if (visibilityStr3.equals("0"))
        imgView3.setVisibility(View.INVISIBLE);
    else
        imgView3.setVisibility(View.VISIBLE);
    

    当然你应该改变你的act1、act2和act3的keyVisibility

    【讨论】:

    • 是的。那就是问题所在。现在我如何在 btns 和图像代码中定义各种键和使用主题?你能帮帮我吗?
    • 您可以为每个图像视图定义唯一键。例如,act1 上的 image1 和 btn1 将是 keyVisibility1,而 act2 上的 image2 和 btn2 将是 keyVisibility2
    • 你说得对。但是当我为按钮制作一个唯一键时,问题就在这里,imageViews 接受它,我不知道为什么:( 你能写下你的电子邮件,然后把项目发给你吗?如果可能的话,为我更改代码吗?我会很感激的。
    【解决方案2】:

    首先,请进一步研究 Android SharedPreferences(如何在本地存储中正确保存/获取共享偏好值)。

    完成研究后,这里有一些提示。希望您能够自己实现。

    保存值 - 单击按钮时保存布尔值

    Context mContext = getApplicationContext();
    SharedPreferences mPrefs = mContext.getSharedPreferences("MySharedPrefs", Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = mPrefs.edit();
    editor.putBoolean("IsImageViewVisible", true); 
    // use different keys for different imageviews; 
    //ex: for ImageView1, use IsImageView_1_Visible; for ImageView2, use IsImageView_2_Visible etc
    editor.commit();
    

    在 MainActivity 中获取值

    Context mContext = getApplicationContext();
    SharedPreferences mPrefs = mContext.getSharedPreferences("MySharedPrefs", Context.MODE_PRIVATE);
    Boolean isImageViewVisible = mPrefs.getBoolean("IsImageViewVisible", false); // here,false is default value
    

    然后,在 MainActivity 中检查所有 imageview 的 visibility

    if(isImageViewVisible){
      // image is visible
    } else{
      // image is invisible
    }
    

    【讨论】:

      【解决方案3】:

      这很简单,您可以使用其中一种方法

      1:共享偏好:

      在您的活动中(Act1、Act2、Act3)

      onClick事件上写下这段代码:

       // on Act1
       final SharedPreferences sharedPreferences=getSharedPreferences("mainconf",MODE_PRIVATE);
      
          buttonOnAct1.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View view) {
                  // check if isVisable and change value
                  if (sharedPreferences.getBoolean("isImg1Visable",true)){
                      sharedPreferences.edit().putBoolean("isImg1Visable",false).apply();
                  }else {
                      // show it again 
                      sharedPreferences.edit().putBoolean("isImg1Visable",true).apply();
                  }
              }
          });
      
      // on Act2
       final SharedPreferences sharedPreferences=getSharedPreferences("mainconf",MODE_PRIVATE);
      
          buttonOnAct2.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View view) {
                  // check if isVisable and change value
                  if (sharedPreferences.getBoolean("isImg2Visable",true)){
                      sharedPreferences.edit().putBoolean("isImg2Visable",false).apply();
                  }else {
                      // show it again 
                      sharedPreferences.edit().putBoolean("isImg2Visable",true).apply();
                  }
              }
          });
      
      // on Act3
       final SharedPreferences sharedPreferences=getSharedPreferences("mainconf",MODE_PRIVATE);
      
          buttonOnAct3.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View view) {
                  // check if isVisable and change value
                  if (sharedPreferences.getBoolean("isImg3Visable",true)){
                      sharedPreferences.edit().putBoolean("isImg3Visable",false).apply();
                  }else {
                      // show it again 
                      sharedPreferences.edit().putBoolean("isImg3Visable",true).apply();
                  }
              }
          });
      

      以及您的MainActivity 的代码:

      public class MainActivity extends AppCompatActivity {
      private ImageView imageView1;
      private ImageView imageView2;
      private ImageView imageView3;
      private SharedPreferences sharedPreferences;
      @Override
      protected void onCreate(@Nullable Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          imageView1=(ImageView)findViewById(R.id.img1);
          imageView2=(ImageView)findViewById(R.id.img2);
          imageView3=(ImageView)findViewById(R.id.img3);
          sharedPreferences=getSharedPreferences("mainconf",MODE_PRIVATE);
      }
      
      
      //  important PART OF CODE 
      @Override
      protected void onResume() {
          super.onResume();
          if (sharedPreferences.getBoolean("isImg1Visable",true)){
              imageView1.setVisibility(View.VISIBLE);
          }else {
              imageView1.setVisibility(View.GONE);
          }
          if (sharedPreferences.getBoolean("isImg2Visable",true)){
              imageView2.setVisibility(View.VISIBLE);
          }else {
              imageView2.setVisibility(View.GONE);
          }
          if (sharedPreferences.getBoolean("isImg3Visable",true)){
              imageView3.setVisibility(View.VISIBLE);
          }else {
              imageView3.setVisibility(View.GONE);
          }
      }
      

      }

      2:公共静态变量:

      将变量写为静态 示例:

      // in Your MainActivty under class
      public static ImageView imageView1;
      public static ImageView imageView2;
      public static ImageView imageView3;
      
      
       // in your Act1 Act2 Act3
      
       // for hiding from mainactivity
       MainActivity.imageView1.setVisibility(View.GONE); // or View.INVISIBLE
       // for showing on main activity
       MainActivity.imageView1.setVisibility(View.VISIBLE);
      

      【讨论】:

      • 它运行良好。应用程序崩溃。为什么你分开写代码的最后一部分?请在活动中写下主题。谢谢。
      • @Nirvana 方法 2 仅在 MainActivity 而不是 stoped 或被破坏时有效,请为我评论完整的错误
      猜你喜欢
      • 1970-01-01
      • 2014-04-04
      • 1970-01-01
      • 1970-01-01
      • 2021-09-16
      • 1970-01-01
      • 1970-01-01
      • 2012-06-15
      • 1970-01-01
      相关资源
      最近更新 更多