#android #android-intent #imagebutton
#Android #android-намерение #imagebutton
Вопрос:
Я пытаюсь использовать намерение для изменения представления в моем коде, чтобы то же предложение работало, но в другом действии это не сработало
nav_top_post = view.findViewById(R.id.nav_top_post);
nav_top_post.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(HomeFragment.this, PostActivity.class));
}
});
в этой части покажите мне красную строку и покажите сообщение
«не удается разрешить намерение конструктора»
Я не могу не найти, что это происходит
-
Это мой frament_home.xml *
<android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@ id/bar" android:background="?android:attr/windowBackground" > <android.support.v7.widget.Toolbar android:layout_width="match_parent" android:layout_height="wrap_content"> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="3dp"> <ImageButton android:id="@ id/nav_top_post" android:layout_width="50dp" android:layout_height="45dp" android:layout_alignParentStart="true" android:layout_marginStart="5dp" android:src="@drawable/ic_top_post_add" /> <ImageView android:layout_width="200dp" android:layout_height="45dp" android:layout_centerInParent="true" android:src="@drawable/together_logo" /> <ImageButton android:layout_width="50dp" android:layout_height="45dp" android:src="@drawable/ic_top_message" android:layout_marginRight="5dp" android:layout_alignParentEnd="true"/> </RelativeLayout> </android.support.v7.widget.Toolbar> </android.support.design.widget.AppBarLayout> <android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@ id/bar" android:id="@ id/recycler_view"> </android.support.v7.widget.RecyclerView>
-
Это мой HomeFragment.class *
пакет com.example.blogapp.Fragment;
импортируйте android.content.Контекст; импортируйте android.content.Намерение; импорт android.net .Uri; импортировать android.os.Bundle; импортировать android.support.v4.app.Fragment; импортировать android.view.LayoutInflater; импорт android.view.View; импорт android.view.ViewGroup; импорт android.widget.ImageButton;
импортируйте com.example.blogapp.Действия.HomeActivity; импортируйте com.example.blogapp.Действия.PostActivity; импортировать com.example.blogapp.R;
общедоступный класс HomeFragment расширяет фрагмент {
ImageButton nav_top_post; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_home, container, false); nav_top_post = view.findViewById(R.id.nav_top_post); nav_top_post.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(HomeFragment.this, PostActivity.class)); } }); // Inflate the layout for this fragment return view; }
}
- And i want to move PostActivity.java with use Intent method *
package com.example.blogapp.Activities;
import android.app.Fragment;
import android.content.ContentResolver;
import android.content.Intent;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.BottomNavigationView;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.webkit.MimeTypeMap;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
импортируйте com.example.blogapp.R; импортируйте com.google.android.gms.tasks.Продолжение; импортируйте com.google.android.gms.tasks.OnCompleteListener; импортируйте com.google.android.gms.tasks.OnFailureListener; импортировать com.google.android.gms.tasks.Задача; импортировать com.google.firebase.auth.FirebaseAuth; импортируйте com.google.firebase.database.DatabaseReference; импортируйте com.google.firebase.database.FirebaseDatabase; импортируйте com.google.firebase.storage.FirebaseStorage; импортируйте com.google.firebase.storage.Ссылка на хранилище; импортируйте com.google.firebase.storage.StorageTask; импортировать com.theartofdev.edmodo.cropper.cropImage;
импортируйте java.util.HashMap;
PostActivity открытого класса расширяет AppCompatActivity {
Uri imageUri;
String myUrl = "";
StorageTask uploadTask;
StorageReference storageReference;
ImageView close, image_added;
TextView post;
EditText description;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_post);
close = findViewById(R.id.close);
image_added = findViewById(R.id.image_added);
post = findViewById(R.id.post);
description = findViewById(R.id.description);
storageReference = FirebaseStorage.getInstance().getReference("posts");
close.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(PostActivity.this, HomeActivity.class));
finish();
}
});
post.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
uploadImage();
}
});
CropImage.activity()
.setAspectRatio(1, 1)
.start(PostActivity.this);
}
private String getFileExtension(Uri uri){
ContentResolver contentResolver = getContentResolver();
MimeTypeMap mime = MimeTypeMap.getSingleton();
return mime.getExtensionFromMimeType(contentResolver.getType(uri));
}
private void uploadImage(){
if(imageUri!= null){
final StorageReference filereference = storageReference.child(System.currentTimeMillis() "." getFileExtension(imageUri));
uploadTask = filereference.putFile(imageUri);
uploadTask.continueWith(new Continuation() {
@Override
public Object then(@NonNull Task task) throws Exception {
if(!task.isComplete()){
throw task.getException();
}
return filereference.getDownloadUrl();
}
}).addOnCompleteListener(new OnCompleteListener<Uri>() {
@Override
public void onComplete(@NonNull Task<Uri> task) {
if(task.isSuccessful()){
Uri downloadUri = task.getResult();
myUrl = downloadUri.toString();
DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Posts");
String postid = reference.push().getKey();
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("postid", postid);
hashMap.put("postimage", myUrl);
hashMap.put("description", description.getText().toString());
hashMap.put("publisher", FirebaseAuth.getInstance().getCurrentUser().getUid());
reference.child(postid).setValue(hashMap);
startActivity(new Intent(PostActivity.this, HomeActivity.class));
finish();;
}else {
showMessage("업로드에 실패하였습니다!");
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
showMessage(e.getMessage());
}
});
} else{
showMessage("이미지를 골라주세요!");
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE amp;amp; resultCode == RESULT_OK){
CropImage.ActivityResult result = CropImage.getActivityResult(data);
imageUri = result.getUri();
image_added.setImageURI(imageUri);
}else{
showMessage("에러가 발생했습니다.");
startActivity(new Intent(PostActivity.this, HomeActivity.class));
finish();
}
}
private void showMessage(String text) {
Toast.makeText(getApplicationContext(),text,Toast.LENGTH_LONG).show();
}
}
* This sentense working in another my class *
close.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(PostActivity.this, HomeActivity.class));
finish();
}
});
в чем причина?
Я надеюсь узнать, в чем причина отображения сообщения об ошибке
Ответ №1:
Измените HomeFragment.this
на HomeFragment.this.getActivity()
при Intent
создании.
startActivity(new Intent(HomeFragment.this.getActivity(), PostActivity.class));
Конструктору Intent требуется Context
, обычно Activity
(но может быть и ApplicationContext
, но это может быть совершенно другая тема сама по себе). A Fragment
не является Activity
, но имеет доступ к родительскому элементу Activity
через getActivity()
метод.
Обратите внимание, что Fragment
должно быть прикреплено к Activity
(обычно это означает «видимый»), чтобы этот метод работал, но это ваш случай.
Комментарии:
1. Спасибо.. Я неправильно понял, что я думал, что это предложение тоже работает во фрагменте
2. Пожалуйста. 🙂 Если это решило вашу проблему, не могли бы вы отметить вопрос как ответ?
Ответ №2:
Вам нужно передать контекст в качестве первого аргумента при использовании намерения.
Итак, используя намерение во фрагменте, вы должны использовать getActivity()
вместо HomeFragment.this
После замены этого это будет
Intent intent = new Intent(getActivity(), PostActivity.class);
startActivity(intent);