是否可以像在 android 中一样为我的应用程序的活动创建一个最近的屏幕

Posted

技术标签:

【中文标题】是否可以像在 android 中一样为我的应用程序的活动创建一个最近的屏幕【英文标题】:Is it possible to create a recents screen like in android for the activities of my app 【发布时间】:2019-09-28 09:39:30 【问题描述】:

我正在尝试制作一个Activity,它将在我的应用程序中而不是在 android 设备中保存所有最近的屏幕。 它的想法是像在 android 中一样创建最近视图。 我暂时不知道如何做到这一点。我在android的官方网站上搜索过,但没有得到我想要的。 我有一些声明为WebView 的活动,我想从Url 中提取title, url and the view 并保存在VisualHistory 上显示。 我能做的设计我已经实现了,但我不知道如何显示最近的屏幕或视图。 背景的颜色应该基于 url。 如果有人不明白某些事情,请告诉我。 您可以在下面找到一张照片,该照片将显示我正在尝试做的事情,我从另一个应用中复制了这张照片。 我已经计划了要遵循的这些步骤来实现这一目标。 在Pojo.classdb 中没有定义image,它将在cardview 中显示,因为我不知道如何实现。 我希望目前蓝色的背景取决于 url 颜色。有什么方法可以获取 url 的颜色吗?

创建一个 POJO.class创建一个存放此数据的数据库创建一个适配器创建片段

我在这里有一个日志,它显示了项目。

[VisualHistoryItemid=109, title='***,免费百科全书', url='https://en.m.wikipedia.org/w/index.php?title=Main_Page', VisualHistoryItemid=112, title='', url='https://mail.google.com/', VisualHistoryItem id=113, title='Gmail - kostenloser Speicherplatz und E-Mails von Google', url='https://www.google.com/intl/de/gmail/about/#']

这会保存一个视觉历史项目。

mVisualHistory.setUrl(url);
mVisualHistory.setTitle(view.getTitle());
Bitmap topass= getSnapshoot.takeScreenShot(BookmarkActivity.this);
   try 
      String filename = mVisualHistory.getId()+".png";
      FileOutputStream stream = BookmarkActivity.this.openFileOutput(filename, Context.MODE_PRIVATE);
     topass.compress(Bitmap.CompressFormat.PNG, 100, stream);
     stream.close();
     topass.recycle();
       catch (Exception e) 
          e.printStackTrace();
      
  mVisualRepository.insertNoteTask(mVisualHistory);

我创建了一个Activity 代码如下。

public class ActivityTabs extends AppCompatActivity implements View.OnClickListener 
    private PopupMenu mPopupMenu;
    private FrameLayout settings;
    private FrameLayout frameLayout;
    private LinearLayout linearLayout;
    private ImageView incognito;
    private TextView textOfHistory;

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    protected void onCreate(@Nullable Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_tabs);
        findViewById(R.id.vgGoMain).setOnClickListener(this);
        findViewById(R.id.vgAdd).setOnClickListener(this);
        settings = findViewById(R.id.vgSettingsHis);
        linearLayout = findViewById(R.id.layoutEmptyVisHistory);
        settings.setOnClickListener(this);
        textOfHistory = findViewById(R.id.tvEmptyHistory);



 FragmentVisualHistoryVertical newFragment = new FragmentVisualHistoryVertical();
    getSupportFragmentManager().beginTransaction().add(R.id.frameLayoutVisHistory, newFragment).commit();
    getSupportFragmentManager()
            .beginTransaction()
            .replace(R.id.frameLayoutVisHistory, newFragment)
            .commit();

    @Override
    public void onClick(View v) 
        switch (v.getId()) 
            case R.id.vgGoMain:
                finish();
                return;
            case R.id.vgAdd:
                Intent intent = new Intent(this, ActivitySearchEngine.class);
                startActivity(intent);
                finish();
                return;
            case R.id.vgSettingsHis:
                showMenuSettings();
                return;
                default:
                    break;
        
    

    public void showMenuSettings() 
        mPopupMenu = new PopupMenu(this, settings);
        final MenuInflater menuInflater = mPopupMenu.getMenuInflater();
        menuInflater.inflate(R.menu.history_settings, mPopupMenu.getMenu());
        mPopupMenu.show();

    

这是XMLActivity

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    android:background="@color/historyEmptyBack"
    android:gravity="center_horizontal"
    android:orientation="vertical">

    <FrameLayout
        android:layout_
        android:layout_>

        <FrameLayout
            android:id="@+id/frameLayoutVisHistory"
            android:layout_
            android:layout_
            android:paddingBottom="@dimen/bottomPanelHeight"></FrameLayout>

        <LinearLayout
            android:id="@+id/layoutEmptyVisHistory"
            android:layout_
            android:layout_
            android:orientation="vertical"
            android:visibility="gone">

            <TextView
                android:id="@+id/tvEmptyHistoryTitle"
                android:layout_
                android:layout_
                android:layout_gravity="center_horizontal"
                android:layout_marginTop="@dimen/common_24dp"
                android:gravity="center_horizontal"
                android:lineSpacingExtra="3.0sp"
                android:text="@string/VHVEmptyTite"
                android:textColor="@color/historyEmptyTitle"
                android:textSize="22.0sp" />

            <FrameLayout
                android:layout_
                android:layout_
                android:layout_marginBottom="48.0dip"
                android:layout_weight="1.0">

                <LinearLayout
                    android:id="@+id/horizontalEmpty"
                    style="@style/LayoutEmptySmile"
                    android:layout_
                    android:layout_
                    android:orientation="vertical">

                    <ImageView
                        style="@style/EmptyHistorySmile"
                        android:src="@drawable/vh_smile_gray" />

                    <TextView
                        style="@style/EmptyHistoryText"
                        android:layout_marginTop="@dimen/common_16dp"
                        android:gravity="center_horizontal"
                        android:paddingLeft="@dimen/common_16dp"
                        android:paddingRight="@dimen/common_16dp"
                        android:text="@string/VHVEmptyDesc" />
                </LinearLayout>

                <LinearLayout
                    android:id="@+id/verticalEmpty"
                    style="@style/LayoutEmptySmile"
                    android:layout_
                    android:layout_
                    android:layout_gravity="center"
                    android:layout_marginLeft="@dimen/common_24dp"
                    android:layout_marginRight="@dimen/common_24dp"
                    android:orientation="horizontal"
                    android:paddingLeft="@dimen/common_16dp"
                    android:paddingTop="@dimen/common_16dp"
                    android:paddingRight="@dimen/common_16dp"
                    android:paddingBottom="@dimen/common_16dp">

                    <ImageView
                        style="@style/EmptyHistorySmile"
                        android:src="@drawable/vh_smile_gray" />

                    <TextView
                        style="@style/EmptyHistoryText"
                        android:layout_
                        android:gravity="left"
                        android:paddingLeft="@dimen/common_16dp"
                        android:text="@string/VHVEmptyDesc" />
                </LinearLayout>

                <LinearLayout
                    android:id="@+id/layoutIncognito"
                    android:layout_
                    android:layout_
                    android:orientation="vertical"
                    android:paddingBottom="@dimen/bottomPanelHeight"
                    android:visibility="visible">

                    <LinearLayout
                        android:id="@+id/layoutEmptyDesc"
                        android:layout_
                        android:layout_
                        android:layout_marginTop="@dimen/common_16dp"
                        android:gravity="center"
                        android:orientation="vertical">

                        <ImageView
                            android:id="@+id/ivEmptyHistory"
                            android:layout_
                            android:layout_
                            android:src="@drawable/incognito_icon_history" />

                        <TextView
                            android:id="@+id/tvEmptyHistory"
                            style="@style/EmptyHistoryText"
                            android:layout_marginTop="@dimen/common_16dp"
                            android:gravity="center_horizontal"
                            android:paddingLeft="@dimen/common_16dp"
                            android:paddingRight="@dimen/common_16dp"
                            android:text="@string/SVSearchPrivateMode"
                            android:textColor="@color/historyTextColor"
                            android:textSize="@dimen/common_18sp" />
                    </LinearLayout>
                </LinearLayout>

            </FrameLayout>

        </LinearLayout>

        <LinearLayout
            android:layout_
            android:layout_
            android:layout_gravity="bottom"
            android:background="@color/historyEmptyBack"
            android:gravity="bottom"
            android:orientation="vertical"
            android:paddingLeft="2.0dip"
            android:paddingRight="2.0dip">

            <LinearLayout
                android:layout_
                android:layout_
                android:gravity="center_vertical"
                android:orientation="horizontal">

                <LinearLayout style="@style/VisHistoryMenuSideLayout">

                    <FrameLayout
                        android:id="@+id/vgGoMain"
                        style="@style/VisHistoryFrLayoutMenu"
                        android:paddingRight="14.0dip">

                        <TextView
                            style="@style/VisHistoryTvMenu"
                            android:text="@string/VHVHomeBarButtonItemTitle" />
                    </FrameLayout>

                    <View style="@style/VisHistoryEmptyView" />
                </LinearLayout>

                <FrameLayout
                    android:id="@+id/vgAdd"
                    style="@style/VisHistoryFrLayoutMenu">

                    <ImageView
                        style="@style/VisHistoryMenuIv"
                        android:scaleX="0.8"
                        android:scaleY="0.8"
                        android:src="@drawable/newtab_button" />
                </FrameLayout>

                <LinearLayout style="@style/VisHistoryMenuSideLayout">
                    <View style="@style/VisHistoryEmptyView" />
                    <FrameLayout
                        android:id="@+id/vgTrash"
                        style="@style/VisHistoryFrLayoutMenu">
                        <ImageView
                            style="@style/VisHistoryMenuIv"
                            android:scaleX="1.3"
                            android:scaleY="1.3"
                            android:src="@drawable/trash" />
                    </FrameLayout>

                    <View style="@style/VisHistoryEmptyView" />

                    <FrameLayout
                        android:id="@+id/vgSettingsHis"
                        style="@style/VisHistoryFrLayoutMenu"
                        android:paddingLeft="0.0dip"
                        android:paddingRight="0.0dip">

                        <android.support.v7.widget.AppCompatImageView
                            style="@style/VisHistoryMenuIv"
                            android:layout_gravity="right"
                            app:srcCompat="@drawable/ic_dots_vertical"
                            tools:ignore="VectorDrawableCompat" />
                    </FrameLayout>
                </LinearLayout>
            </LinearLayout>
        </LinearLayout>
    </FrameLayout>
</LinearLayout>

这是另一个Fragment 这里将显示列表

  public class FragmentVisualHistoryVertical extends FragmentVisualHistory implements VisualRecyclerAdapter.OnVisualHistoryItemListener 
    public View paramView;
    private VisualRecyclerAdapter mVisualHistoryRecyclerAdapter;
    private RecyclerView mRecyclerView;
    private VisualHistoryRepository getmNoteRepository;

    private ArrayList<VisualHistoryItem> mVisualHistoryItems = new ArrayList<>();

    @Override
    public void onAttach(Context context) 
        super.onAttach(context);
        mContext = context;
    

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) 
        paramView = inflater.inflate(R.layout.fragment_vis_history_vertical, container, false);
        mRecyclerView = paramView.findViewById(R.id.rvWebHistory);
        initRecyclerView();
        getmNoteRepository = new VisualHistoryRepository(getActivity());
        retrieveVisualHistory();
        return paramView;
    

    private void initRecyclerView()
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
        mRecyclerView.setLayoutManager(linearLayoutManager);
        linearLayoutManager.setReverseLayout(true);
        new ItemTouchHelper(itemTouchHelperCallback).attachToRecyclerView(mRecyclerView);
        mVisualHistoryRecyclerAdapter = new VisualRecyclerAdapter(mVisualHistoryItems, this, mContext);
        DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(mRecyclerView.getContext(),
                linearLayoutManager.getOrientation());
        mRecyclerView.addItemDecoration(dividerItemDecoration);
        mRecyclerView.setAdapter(mVisualHistoryRecyclerAdapter);
    
    private void retrieveVisualHistory() 
        getmNoteRepository.retrieveVisualHistoryTask().observe(this, new Observer<List<VisualHistoryItem>>() 
            @Override
            public void onChanged(@Nullable List<VisualHistoryItem> item) 
                if(mVisualHistoryItems.size() > 0)
                    mVisualHistoryItems.clear();
                
                if(item != null)
                    mVisualHistoryItems.addAll(item);
                
                mVisualHistoryRecyclerAdapter.notifyDataSetChanged();
            
        );
    


    @Override
    public void onItemClicked(int position) 

    
    private void deleteNote(VisualHistoryItem item) 
        mVisualHistoryItems.remove(item);
        mVisualHistoryRecyclerAdapter.notifyDataSetChanged();

        getmNoteRepository.deleteVisualHistoryTask(item);
    
    ItemTouchHelper.SimpleCallback itemTouchHelperCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.RIGHT) 
        @Override
        public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) 
            return false;
        

        @Override
        public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) 
            deleteNote(mVisualHistoryItems.get(viewHolder.getAdapterPosition()));
        
    ;

这是XML

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:aapt="http://schemas.android.com/aapt" android:id="@+id/rvWebHistory" android:layout_ android:layout_/>

这是room db

@Database(entities = VisualHistoryItem.class, version = 1)
public abstract class VisualHistoryDB extends RoomDatabase 
private static final String DATABASE_NAME = "visualHistory_db";
private static VisualHistoryDB instance;

public static VisualHistoryDB getInstance(final Context context) 
    if (instance == null) 
        instance = Room.databaseBuilder(
                context.getApplicationContext(),
                VisualHistoryDB.class,
                DATABASE_NAME
        ).build();
    
    return instance;


public abstract VisualHistoryDao getVisualHistoryDao();

room db Dao

@Dao
public interface VisualHistoryDao 

@Insert
long[] insertVisualHistory(VisualHistoryItem... visualHistoryItems);

@Query("SELECT * FROM visualHistory")
LiveData<List<VisualHistoryItem>> getVisualHistory();

@Delete
int delete(VisualHistoryItem... visualHistoryItems);

这是pojo.class

@Entity(tableName = "visualHistory")
public class VisualHistoryItem implements Parcelable 

@PrimaryKey(autoGenerate = true)
private int id;

@ColumnInfo(name = "title")
private String title;

@ColumnInfo(name = "url")
private String url;

public VisualHistoryItem(int id, String title, String url) 
    this.id = id;
    this.title = title;
    this.url = url;


@Ignore
public VisualHistoryItem() 


protected VisualHistoryItem(Parcel in) 
    id = in.readInt();
    title = in.readString();
    url = in.readString();


public static final Creator<VisualHistoryItem> CREATOR = new Creator<VisualHistoryItem>() 
    @Override
    public VisualHistoryItem createFromParcel(Parcel in) 
        return new VisualHistoryItem(in);
    

    @Override
    public VisualHistoryItem[] newArray(int size) 
        return new VisualHistoryItem[size];
    
;

public int getId() 
    return id;

public void setId(int id) 
    this.id = id;

public String getTitle() 
    return title;

public void setTitle(String title) 
    this.title = title;


public String getUrl() 
    return url;

public void setUrl(String url) 
    this.url = url;


@Override
public String toString() 
    return "VisualHistoryItem" +
            "id=" + id +
            ", title='" + title + '\'' +
            ", url='" + url + '\'' +
            '';


@Override
public int describeContents() 
    return 0;


@Override
public void writeToParcel(Parcel parcel, int flags) 
    parcel.writeInt(id);
    parcel.writeString(title);
    parcel.writeString(url);


这是Adapter

    public class VisualRecyclerAdapter extends RecyclerView.Adapter<VisualRecyclerAdapter.ViewHolder> 

    private ArrayList<VisualHistoryItem> mVisualHistoryItem  = new ArrayList<>();
    private OnVisualHistoryItemListener mItemListener;
    private final Context context;

    public VisualRecyclerAdapter(ArrayList<VisualHistoryItem> mVisualHistoryItem, OnVisualHistoryItemListener mItemListener, Context context) 
        this.context = context;
        this.mVisualHistoryItem = mVisualHistoryItem;
        this.mItemListener = mItemListener;
    

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) 
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.fragment_visual_history, viewGroup, false);

        return new ViewHolder(view, mItemListener);
    

    @Override
    public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) 
        Resources res = viewHolder.itemView.getContext().getResources();
        viewHolder.visFragmentMain.setBackgroundColor(res.getColor(R.color.blue_text));
        viewHolder.tvPageUrl.setText(mVisualHistoryItem.get(i).getUrl());
        viewHolder.tvPageName.setText(mVisualHistoryItem.get(i).getTitle());
        Bitmap bmp = null;
        String filename = mVisualHistoryItem.get(i).getId()+".png";
        try 
            FileInputStream is = context.openFileInput(filename);
            bmp = BitmapFactory.decodeStream(is);
            is.close();
         catch (Exception e) 
            e.printStackTrace();
        
        if (bmp!=null) 
            BitmapDrawable ob = new BitmapDrawable(context.getResources(), bmp);
            viewHolder.ivVisualHistory.setBackground(ob);
        
    

    @Override
    public int getItemCount() 
        return mVisualHistoryItem.size();
    
    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener 
        ImageView ivVisualHistory;
        OnVisualHistoryItemListener itemListener;
        TextView tvPageName, tvPageUrl;
        RelativeLayout visFragmentMain;
        CardView cardView;
        public ViewHolder(@NonNull View itemView, OnVisualHistoryItemListener mItemListener) 
            super(itemView);
            itemListener = mItemListener;
            ivVisualHistory = itemView.findViewById(R.id.ivVisualHistory);
            visFragmentMain = itemView.findViewById(R.id.visFragmentMain);
            tvPageName = itemView.findViewById(R.id.tvPageName);
            tvPageUrl = itemView.findViewById(R.id.tvPageUrl);
            cardView = itemView.findViewById(R.id.cardView);
        

        @Override
        public void onClick(View v) 
            itemListener.onItemClicked(getAdapterPosition());
        
    

    public interface OnVisualHistoryItemListener 
        void onItemClicked(int position);
    

这就是我想要达到的目标。

这是我的真实看法。

【问题讨论】:

你不需要同时添加和替换片段,它应该在if(savedInstanceState == null检查中。 你能更具体地说明我需要在哪里添加这个吗? R.layout.fragment_visual_history 是什么样的?猜猜你已经开始工作了吗? 我已经附上了第二张照片的外观,但我想看起来像第一张照片。 你必须调整xml。您的第二张图片显示您必须更改视图的 xml 高度和宽度!?? 【参考方案1】:

您可以获取网站的图标并使用 android explained here 的 Palette 类来获取 url 的突出颜色,如果您想获取快照,您可以在启动另一个之前保存快照并保存实例数据活动。在创建 util 类后,可以使用takenapshot meathod 进行快照,代码如下:

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Rect;
import android.view.View;

class Util 
    static Bitmap takeScreenShot(Activity activity) 
        View view = activity.getWindow().getDecorView();
        view.setDrawingCacheEnabled(true);
        view.buildDrawingCache();
        Bitmap b1 = view.getDrawingCache();
        Rect frame = new Rect();
        activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
        int statusBarHeight = frame.top;

        //Find the screen dimensions to create bitmap in the same size.
        int width = activity.getWindowManager().getDefaultDisplay().getWidth();
        int height = activity.getWindowManager().getDefaultDisplay().getHeight();

        Bitmap b = Bitmap.createBitmap(b1, 0, statusBarHeight, width, height - statusBarHeight);
        view.destroyDrawingCache();
        return b;
    

在您的活动中使用它来将其保存为 png 文件,如下所示:

Bitmap topass=Util.takeScreenShot(this);
                try 
                    //Write file
                    String filename = "bitmap.png";
                    FileOutputStream stream = this.openFileOutput(filename, Context.MODE_PRIVATE);
                    topass.compress(Bitmap.CompressFormat.PNG, 100, stream);

                    //Cleanup
                    stream.close();
                    topass.recycle();
                 catch (Exception e) 
                    e.printStackTrace();
                

不要使用名称“bitmap.png”,而是使用您的“id.png”(String.valueof(id)+“.png”),因为您已将int“id”名称放入您的数据库中。您可以使用其 ID 保存每个活动的屏幕截图,并且每当您构建它的卡片视图时,以“i​​d.png”的名称显示屏幕截图。要显示屏幕截图,您可以使用

Bitmap bmp = null;
        String filename = String.valueof(getId())+".png";
        try 
            FileInputStream is = this.openFileInput(filename);
            bmp = BitmapFactory.decodeStream(is);
            is.close();
         catch (Exception e) 
            e.printStackTrace();
        
        if(bmp!=null)
        
            ConstraintLayout cl =findViewById(R.id.shopbk); //it can be your any view
            BitmapDrawable ob = new BitmapDrawable(getResources(), bmp);
            cl.setBackground(ob); /* you should use glide here to show bitmap drawable as your preview will be very small as compared to screenshot actual size*/
          

就获取颜色(您说链接不起作用)而言,您可以首先使用

获取位图
try 
        URL url = new URL("http://..somepath url../favicon.ico");
        Bitmap image = BitmapFactory.decodeStream(url.openConnection().getInputStream());
     catch(IOException e) 
        System.out.println(e);
      

然后使用调色板提取颜色使用

Palette.generateAsync(image, new Palette.PaletteAsyncListener() 
    public void onGenerated(Palette palette) 
        // Do something with colors...
    
);

为此,您需要实现一个依赖项

dependencies 
    ...
    compile 'com.android.support:palette-v7:21.0.+'
  

【讨论】:

谢谢你的代码,我会试试这个,但在你的回答中你添加了一个获取颜色的链接,但没有来自 URL,你能提供一个代码吗?我需要将拍摄的颜色添加到RelativeLayout,请参阅我的Adapter 中的声明。 如何在 CardView 中显示此快照或保存在房间数据库和适配器中以显示此快照。 这是对运行代码的活动类的上下文的引用。否,在此代码中,您没有将此图像保存在 db 中,而是将其保存为名称与活动 ID 相同的文件。在您最近的应用程序中更新/终止活动后,您可以更新/删除/删除此文件。 究竟是什么错误?您在哪个类中使用此代码? 使用“mContext.this”,我希望它能在你的代码中正常工作

以上是关于是否可以像在 android 中一样为我的应用程序的活动创建一个最近的屏幕的主要内容,如果未能解决你的问题,请参考以下文章

是否可以像在 Android Studio 中一样在 Eclipse 中使用 Firebase? [复制]

如何在 Android 中像在 Google 地图中一样获得持续的位置更新?

我们可以像在 android 中一样在 windows 中创建 XMPP 聊天客户端代码吗?

Swift3 如何像在 android 中一样在 iOS 中实现底部工作表

控制台检查按下的键,就像在 monogame 中一样

像在 Android Studio 中一样在 vscode 中颤动代码格式