簡體   English   中英

如何將 setbackground 屬性與 URL 一起使用

[英]How to use setbackground property with URL

我想知道,如何使用 Url 設置特定視圖的背景。 像這樣的東西:

TextView someview;
someview.setbackground(url).

假設我通過我的 model ZA2F35E630DAF44DBFA4C3F68F5399D8CZ ZA2F8D092741943E4A83241F5AF9Z 數據庫中的 URL

有人可以幫我清楚地理解這一點...

實際上,我正在嘗試從我創建的 Firebase 節點加載用戶狀態。 下面是整個代碼和解釋: 問題出在適配器 class 中,我在那里評論請檢查...

我想從 firebase 實現的節點: 在此處輸入圖像描述

該節點的 Model class :

package com.example.sociapp;

public class Status {

    String backgrounduri, date, fullname, profileimage, e, time, uid, userstatus;
    long textcolor, textsize;
    public Status ( )
    {

    }

    public Status(String backgrounduri, String date, String fullname, String profileimage, long textcolor, long textsize, String time, String uid, String userstatus)
    {
        this.backgrounduri = backgrounduri;
        this.date = date;
        this.fullname = fullname;
        this.profileimage = profileimage;
        this.textcolor = textcolor;
        this.textsize = textsize;
        this.time = time;
        this.uid = uid;
        this.userstatus = userstatus;
    }

    public String getBackgrounduri() {
        return backgrounduri;
    }

    public void setBackgrounduri(String backgrounduri) {
        this.backgrounduri = backgrounduri;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public String getFullname() {
        return fullname;
    }

    public void setFullname(String fullname) {
        this.fullname = fullname;
    }

    public String getProfileimage() {
        return profileimage;
    }

    public void setProfileimage(String profileimage) {
        this.profileimage = profileimage;
    }

    public long getTextcolor() {
        return textcolor;
    }

    public void setTextcolor(long textcolor) {
        this.textcolor = textcolor;
    }

    public long getTextsize() {
        return textsize;
    }

    public void setTextsize(long textsize) {
        this.textsize = textsize;
    }

    public String getTime() {
        return time;
    }

    public void setTime(String time) {
        this.time = time;
    }

    public String getUid() {
        return uid;
    }

    public void setUid(String uid) {
        this.uid = uid;
    }

    public String getUserstatus() {
        return userstatus;
    }

    public void setUserstatus(String userstatus) {
        this.userstatus = userstatus;
    }
}

下面是適配器 class:

public class StatusAdapter extends RecyclerView.Adapter<StatusAdapter.viewHolder> {

   java.util.List<String> statuskeyList;
    List<Status> SList;
    Context context;

    DatabaseReference ClickstatusRef;
    FirebaseAuth mAuth;

    public StatusAdapter(List<String> statuskeyList, List<Status> SList, Context context)
    {
        this.statuskeyList = statuskeyList;
        this.SList = SList;
        this.context = context;
    }

    @NonNull
    @Override
    public viewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

         View view = LayoutInflater.from(context).inflate(R.layout.all_user_status_layout, parent, false);
        return new viewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull viewHolder holder, int position) {

        Status status = SList.get(position);
        String statusKey = statuskeyList.get(position);
        mAuth = FirebaseAuth.getInstance();
        final String   CurrentUserId = mAuth.getCurrentUser().getUid();

        Picasso.get().load(status.getProfileimage()).placeholder(R.drawable.profile).into(holder.Profileimage);
        holder.FullName.setText(status.getFullname());
        holder.Date.setText(status.getDate());
        holder.Time.setText(status.getTime());
        holder.UserStatus.setText(status.getUserstatus());

        ClickstatusRef = FirebaseDatabase.getInstance().getReference().child("Status").child(statusKey);
       /* String name = status.getBackgrounduri();
        int id = context.getResources().getIdentifier(name, "drawable", context.getPackageName());
        Drawable drawable = context.getResources().getDrawable(id);*/
       try {
           int status_background = Integer.parseInt(status.getBackgrounduri());
           holder.UserStatus.setBackgroundResource(status_background);
          }
       catch (NumberFormatException e)
              {
                  e.printStackTrace();
              }
//I tried all the code for setting background commented and not commented but no use

//問題出在這里,這里我設置的是從firebase得到的背景Url。 我嘗試了您在此處看到的所有代碼,但沒有評論// holder.UserStatus.setBackground(context.getResources().getDrawable(context.getResources().getIdentifier("SociApp", "getBackground",context.getPackageName())));

    int status_color = (int) status.getTextcolor();
    holder.UserStatus.setTextColor(status_color);
    int Text_Size = (int)  status.getTextsize()/ 3 ;
    holder.UserStatus.setTextSize(Text_Size);


    holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {

         ClickstatusRef.addValueEventListener(new ValueEventListener() {
             @Override
             public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                 if (dataSnapshot.exists())
                 {
                     String statusUserId = dataSnapshot.child("uid").getValue().toString();

                     if (statusUserId.equals(CurrentUserId))
                     {
                         View mview = LayoutInflater.from(context).inflate(R.layout.dialog_layout, null);
                         TextView Message = mview.findViewById(R.id.dialog_text);
                         Button OkBtn = mview.findViewById(R.id.dialog_btn);
                         AlertDialog.Builder mbuilder = new AlertDialog.Builder(context, R.style.mydialog);
                         mbuilder.setView(mview);
                         String message = "Do you want to delete your status!";
                         Message.setText(message);
                         OkBtn.setText("Do it");
                         OkBtn.setWidth(100);
                         final Dialog dialog = mbuilder.create();
                         dialog.show();

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

                                 ClickstatusRef.removeValue();
                                 dialog.dismiss();
                                 SendUserToLoadstatusActivity();
                             }
                         });
                     }

                     else
                     {
                         Toast.makeText(context, "You just long clicked the status", Toast.LENGTH_SHORT).show();
                     }
                 }
             }

             @Override
             public void onCancelled(@NonNull DatabaseError databaseError) {

             }
         });

            return true;
        }
    });

}

private void SendUserToLoadstatusActivity()
{
    Intent MainIntent = new Intent(context, LoadStatusActivity.class);
    MainIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
   context.startActivity(MainIntent);
}

@Override
public int getItemCount()
{
    return SList.size();
}

public class viewHolder extends RecyclerView.ViewHolder{

    private CircleImageView Profileimage;
    private TextView FullName;
    private TextView Date,Time;
    private TextView UserStatus;

    public viewHolder(@NonNull View itemView)
    {
        super(itemView);

        Profileimage = itemView.findViewById(R.id.status_profile_image);
        FullName = itemView.findViewById(R.id.status_user_name);
        Date = itemView.findViewById(R.id.status_date);
        Time = itemView.findViewById(R.id.status_time);
        UserStatus = itemView.findViewById(R.id.all_user_status);

    }
}

}

下面我將數據從 LoadStatusActivity 傳遞給數組列表:

public class LoadStatusActivity extends AppCompatActivity {

    private Toolbar mtoolbar;
    private TextView UserStatusButton;
    private RecyclerView StatusList;
    private ProgressBar ProgressCircular;

    private DatabaseReference StatusRef;
    private FirebaseAuth mAuth;

    private List<Status> mUserStatus;

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

        mtoolbar = findViewById(R.id.status_page_toolbar);
        setSupportActionBar(mtoolbar);

        mAuth = FirebaseAuth.getInstance();
        StatusList = (RecyclerView) findViewById(R.id.all_users_status_list);
        ProgressCircular = (ProgressBar) findViewById(R.id.status_progress_circular);

        StatusRef = FirebaseDatabase.getInstance().getReference().child("Status");

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
        getSupportActionBar().setTitle("Status");

        UserStatusButton = findViewById(R.id.status_post_btn);

        mUserStatus = new ArrayList();
        final List<String> Keys = new ArrayList<>();

        StatusList.setHasFixedSize(true);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        linearLayoutManager.setReverseLayout(true);
        linearLayoutManager.setStackFromEnd(true);
        StatusList.setLayoutManager(linearLayoutManager);

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

        Query sortStatusInDescendantOrder = StatusRef.orderByChild("counter");

        sortStatusInDescendantOrder.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                mUserStatus.clear();

                if (dataSnapshot.exists()) {

                    for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) {

                        Keys.add(dataSnapshot1.getKey());

                        Status status = dataSnapshot1.getValue(Status.class);
                        mUserStatus.add(status);

                    }

                    StatusAdapter statusAdapter = new StatusAdapter( Keys, mUserStatus, LoadStatusActivity.this);
                    StatusList.setAdapter(statusAdapter);
                    ProgressCircular.setVisibility(View.INVISIBLE);

                } else {

                    Toast.makeText(LoadStatusActivity.this, "There is no post Exists! " + DatabaseError.PERMISSION_DENIED, Toast.LENGTH_SHORT).show();
                    ProgressCircular.setVisibility(View.INVISIBLE);
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });

    }

    private void SendUserToStatusPostActivity() {

        Intent StatusPostIntent = new Intent(LoadStatusActivity.this, StatusPostActivity.class);
        startActivity(StatusPostIntent);
    }
}

我得到的 Output: 在此處輸入圖像描述

但我想要的文本不僅是文本,而且背景 url 保存在backgrounduri中,如頂部的第一張圖片所示。 如何加載它。 在此處輸入圖像描述

您必須從給定的 URL 下載Bitmap並將此Bitmap設置為TextView的背景Drawable

要下載Bitmap ,您必須將 Internet 權限添加到您的AndroidManifest.xml

您可以像這樣從給定的 url 下載Bitmap

try {
    // create url from string
    URL url = new URL(imageUrl);
    // connect to url
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    connection.setDoInput(true);
    connection.connect();
    // download image
    InputStream input = connection.getInputStream();
    Bitmap myBitmap = BitmapFactory.decodeStream(input);
    # return myBitmap or do something else
} catch (IOException e) {
    e.printStackTrace();
    return null;
}

要將此Bitmap設置為TextView的背景,您必須首先使用以下方法將其轉換為Drawable

// create drawable from bitmap
Drawable dr = new BitmapDrawable(myBitmap);
myTextView.setBackground(dr);

我在評論中從上面的鏈接中找到了答案。 對於我的問題,我通過在我上面評論的地方的適配器 class 中添加以下代碼來解決它:

我需要的代碼和平:

 StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
        try {
            URL url = new URL(status.backgrounduri);
            Bitmap image = BitmapFactory.decodeStream(url.openConnection().getInputStream());
            Drawable dr = new BitmapDrawable(image);
            holder.UserStatus.setBackgroundDrawable(dr);
        } catch(IOException e) {
            System.out.println(e);
        }

        int status_color = (int) status.getTextcolor();
        holder.UserStatus.setTextColor(status_color);
        int Text_Size = (int)  status.getTextsize()/ 3 ;
        holder.UserStatus.setTextSize(Text_Size);

我們可以通過下載字符串格式的 URL 然后將其轉換為 Bitmap 然后將 bitmap 轉換為可繪制的格式(並通過使用 setback 設置為背景)來做到這一點

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM