在 Android TV 上将 ProgressBar 添加到 DetailsOverviewRow

     2023-04-15     74

关键词:

【中文标题】在 Android TV 上将 ProgressBar 添加到 DetailsOverviewRow【英文标题】:Adding ProgressBar to DetailsOverviewRow on Android TV 【发布时间】:2015-08-19 15:18:58 【问题描述】:

我正在尝试为 Android TV 应用创建 android.support.v17.leanback.widget.DetailsOverviewRow 的略微修改版本。我试图完成的布局与谷歌的默认版本大致相同,但在操作面板上方添加了一个进度条。我现在的样子是这样的:

Current Version

我想要创建的内容大致是这样的:

Goal Version

如果可能的话,我想动态添加它,而不必从头开始创建一个全新的布局。这是我目前使用的代码,对 Android Studio 中的默认 Android TV 应用稍作修改:

public class VideoDetailsFragment extends DetailsFragment 
private static final String TAG = "VideoDetailsFragment";

private static final int ACTION_UPDATE = 1;
private static final int ACTION_CHANGELOG = 2;
private static final int ACTION_INSTALLED = 3;

private static final int DETAIL_THUMB_WIDTH = 274;
private static final int DETAIL_THUMB_HEIGHT = 274;

private static final int NUM_COLS = 10;

private static final String UPDATE = "Update";

private Update mSelectedUpdate;

private Drawable mDefaultBackground;
private Target mBackgroundTarget;
private DisplayMetrics mMetrics;
private DetailsOverviewRowPresenter mDorPresenter;
private DetailRowBuilderTask mDetailRowBuilderTask;

@Override
public void onCreate(Bundle savedInstanceState) 
    Log.i(TAG, "onCreate DetailsFragment");
    super.onCreate(savedInstanceState);

    mDorPresenter =
            new DetailsOverviewRowPresenter(new DetailsDescriptionPresenter());

    BackgroundManager backgroundManager = BackgroundManager.getInstance(getActivity());
    backgroundManager.attach(getActivity().getWindow());
    mBackgroundTarget = new PicassoBackgroundManagerTarget(backgroundManager);

    mDefaultBackground = getResources().getDrawable(R.drawable.default_background);

    mMetrics = new DisplayMetrics();
    getActivity().getWindowManager().getDefaultDisplay().getMetrics(mMetrics);

    List<Update> list = UpdateList.setupMovies();
    mSelectedUpdate = list.get(0);//(Update) getActivity().getIntent().getSerializableExtra(MOVIE);
    mDetailRowBuilderTask = (DetailRowBuilderTask) new DetailRowBuilderTask().execute(list);
    mDorPresenter.setSharedElementEnterTransition(getActivity(),
            DetailsActivity.SHARED_ELEMENT_NAME);

    setOnItemViewClickedListener(new ItemViewClickedListener());



@Override
public void onStop() 
    mDetailRowBuilderTask.cancel(true);
    super.onStop();


private class DetailRowBuilderTask extends AsyncTask<List<Update>, Integer, List<DetailsOverviewRow>> 
    @Override
    protected List<DetailsOverviewRow> doInBackground(List<Update>... movies) 
        List<DetailsOverviewRow> rows = new ArrayList<DetailsOverviewRow>();

        int exampleUpdate = 0;

        for (Update m: movies[0]) 
            DetailsOverviewRow row = new DetailsOverviewRow(m);
            try 
                //String test = mSelectedUpdate.getCardImageUrl();
                Bitmap poster = Picasso.with(getActivity())
                        .load(m.getCardImageUrl())
                        .resize(Utils.convertDpToPixel(getActivity().getApplicationContext(), DETAIL_THUMB_WIDTH),
                                Utils.convertDpToPixel(getActivity().getApplicationContext(), DETAIL_THUMB_HEIGHT))
                        .centerCrop()
                        .get();
                row.setImageBitmap(getActivity(), poster);
             catch (IOException e) 
                e.printStackTrace();
                Log.e(TAG, e.toString(), e);
            

            SparseArrayObjectAdapter adapter = new SparseArrayObjectAdapter();
            if (exampleUpdate++ == 0) 
                Action a1 = new Action(ACTION_UPDATE, getResources().getString(R.string.download));
                Action a2 = new Action(ACTION_CHANGELOG, getResources().getString(R.string.release_notes));
                adapter.set(ACTION_UPDATE, a1);
                adapter.set(ACTION_CHANGELOG, a2);
                row.setActionsAdapter(adapter);
            else
                Action a1 = new Action(ACTION_INSTALLED, getResources().getString(
                        R.string.installed));
                Action a2 = new Action(ACTION_CHANGELOG, getResources().getString(R.string.release_notes));
                //ProgressBar p1 = new ProgressBar(getActivity(),null, android.R.attr.progressBarStyleHorizontal);
                adapter.set(1, a1);
                adapter.set(2, a2);
                //adapter.set(3, p1);
                row.setActionsAdapter(adapter);
            
            rows.add(row);
        
        return rows;
    

    @Override
    protected void onPostExecute(List<DetailsOverviewRow> detailRows) 
        ClassPresenterSelector ps = new ClassPresenterSelector();
        // set detail background and style

        mDorPresenter.setBackgroundColor(getResources().getColor(R.color.black_opaque));
        Log.i("TEST", "Setting BG Color of Detail View");
        mDorPresenter.setStyleLarge(true);
        mDorPresenter.setOnActionClickedListener(new OnActionClickedListener() 
            @Override
            public void onActionClicked(Action action) 
                if (action.getId() == ACTION_UPDATE) 
                    /*Intent intent = new Intent(getActivity(), PlaybackOverlayActivity.class);
                    intent.putExtra(getResources().getString(R.string.movie), mSelectedUpdate);
                    intent.putExtra(getResources().getString(R.string.should_start), true);
                    startActivity(intent);*/
                    Toast.makeText(getActivity(), "Download Update", Toast.LENGTH_SHORT).show();
                 else 
                    Toast.makeText(getActivity(), action.toString(), Toast.LENGTH_SHORT).show();
                
            
        );

        ps.addClassPresenter(DetailsOverviewRow.class, mDorPresenter);
        ps.addClassPresenter(ListRow.class,
                new ListRowPresenter());


        ArrayObjectAdapter adapter = new ArrayObjectAdapter(ps);

        for(DetailsOverviewRow detailRow : detailRows)
            adapter.add(detailRow);
        

        String subcategories[] = 
                getString(R.string.related_movies)
        ;

        //HeaderItem header = new HeaderItem(0, subcategories[0]);
        //adapter.add(new ListRow(header, listRowAdapter));

        setAdapter(adapter);
    



private final class ItemViewClickedListener implements OnItemViewClickedListener 
    @Override
    public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
                              RowPresenter.ViewHolder rowViewHolder, Row row) 

        if (item instanceof Update) 
            Update update = (Update) item;
            Log.d(TAG, "Item: " + item.toString());
            Intent intent = new Intent(getActivity(), DetailsActivity.class);
            intent.putExtra(DetailsActivity.MOVIE, update);

            Bundle bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(
                    getActivity(),
                    ((ImageCardView) itemViewHolder.view).getMainImageView(),
                    DetailsActivity.SHARED_ELEMENT_NAME).toBundle();
            getActivity().startActivity(intent, bundle);
        
    




有没有一种简单的方法来添加 ProgressBar 或者我需要创建一个全新的 xml 布局来做到这一点?

【问题讨论】:

能否访问原始XML文件并手动添加栏? 我不确定在哪里可以找到该文件。我可以访问为 android.support.v17.leanback 库生成的 R 文件,但我不确定 xml 文件是否存在。 【参考方案1】:

我想出了一个办法。我最终创建了 lb_details_overview.xml 的修改版本,在创建 DetailOverviewRow 时由 support.v17.leanback 库使用。我基本上只是添加了一个带有 ProgressBar 的 RelativeLayout。我还必须在leanback 库中制作DetailsOverviewRowPresenter.java 的修改版本,以便扩展新的xml 布局而不是现有的。这可能不是最好或最简单的方法,但它确实有效。

【讨论】:

有机会分享一下吗? 你用什么方法扩充了 XML 布局?我看到createRowViewHolder 调用了私人initDetailsOverView()。您是否必须重新创建后一个私有方法? 你能分享你修改后的布局和 Presenter 类吗?

如何在android上将kotlin转换为java? [复制]

】如何在android上将kotlin转换为java?[复制]【英文标题】:Howtoconvertkotlintojavaonandroid?[duplicate]【发布时间】:2018-11-0409:57:00【问题描述】:最近我在学习kotlin。首先,kotlin不支持static。所以我使用companionobjectcompanionobjectInstanceHolder... 查看详情

java示例代码_在android上将xml转换为html

java示例代码_在android上将xml转换为html 查看详情

如何在 Android 上将 Javascript 注入 GeckoView

】如何在Android上将Javascript注入GeckoView【英文标题】:HowtoinjectJavascripttoGeckoViewonAndroid【发布时间】:2019-12-0605:57:07【问题描述】:我想在我的项目中使用GeckoView。但我需要在这个项目中运行一些Javascript代码。我怎样才能做到这... 查看详情

在 Android 上将图片翻译成文本?

】在Android上将图片翻译成文本?【英文标题】:TranslateapicturetotextonAndroid?【发布时间】:2011-02-2316:09:54【问题描述】:我知道谷歌护目镜会将图片翻译成文字。我想做的是让用户拍照(没问题),将该图片翻译成文本(?),... 查看详情

在 Android 上将字符串转换为整数

】在Android上将字符串转换为整数【英文标题】:ConvertingastringtoanintegeronAndroid【发布时间】:2011-02-1203:33:18【问题描述】:如何将字符串转换为整数?我有一个文本框让用户输入一个数字:EditTextet=(EditText)findViewById(R.id.entry1);Strin... 查看详情

如何在 Android 上将数据保存到文本文件?

】如何在Android上将数据保存到文本文件?【英文标题】:HowtosavedatatoatextfileonAndroid?【发布时间】:2011-08-0700:29:47【问题描述】:我需要将用户输入的数据(例如姓名和年龄)保存到Android上的文本文件中,以便随后将其保存到MyS... 查看详情

如何在Android上将图像字符串转换为整数?

】如何在Android上将图像字符串转换为整数?【英文标题】:HowtoconvertanimagestringintointegeronAndroid?【发布时间】:2021-09-1706:21:31【问题描述】:我想从Firebase检索图像并将其放置在画布中,以便使用它放置在自定义google标记中。使... 查看详情

如何在 Android 设备上将 WAV 编码为 mp3

】如何在Android设备上将WAV编码为mp3【英文标题】:HowtoencodeaWAVtoamp3onaAndroiddevice【发布时间】:2010-09-0410:50:49【问题描述】:我已经简化了我的问题并提供了赏金:有哪些选项可用于在Android设备上将原始PCM音频数据压缩为mp3。我... 查看详情

如何在 Android 设备上将 WAV 编码为 mp3

】如何在Android设备上将WAV编码为mp3【英文标题】:HowtoencodeaWAVtoamp3onaAndroiddevice【发布时间】:2011-04-0804:50:00【问题描述】:我已经简化了我的问题并提供了赏金:有哪些选项可用于在Android设备上将原始PCM音频数据压缩为mp3。我... 查看详情

在 Android 上将 Web 图像转换为 ListView

】在Android上将Web图像转换为ListView【英文标题】:WebImagesintoListViewonAndroid【发布时间】:2017-02-2607:04:40【问题描述】:我是Java初学者,我想在JSON的ListView上显示Web图像。现在我已经用文本字符串和本地图像(mipmap.ic_launcher)创... 查看详情

Android TV 应用无法安装在 Android TV 设备上

】AndroidTV应用无法安装在AndroidTV设备上【英文标题】:AndroidTVappcan\'tbeinstalledonAndroidTVdevices【发布时间】:2021-06-1005:34:33【问题描述】:我已经在GooglePlayStore上发布了应用。在我尝试过的任何运行AndroidTV的设备上的GooglePlay商店应... 查看详情

如何在 Android 上将“选择操作”更改为“使用完成操作”?

】如何在Android上将“选择操作”更改为“使用完成操作”?【英文标题】:Howtochange"Chooseanaction"to"Completeactionusing"onAndroid?【发布时间】:2012-08-2918:02:08【问题描述】:我有一个NFC应用程序,它允许用户扫描他们的... 查看详情

在android中的ListView上将动作模式显示为LongClick

】在android中的ListView上将动作模式显示为LongClick【英文标题】:showActionModeasLongClickonListViewinandroid【发布时间】:2015-06-0210:17:43【问题描述】:我想在我的项目中的ListView的每一行上通过LongClicking显示ActionMode菜单(以获得更多选... 查看详情

Xamarin Android 仅在手机上将方向锁定为纵向

】XamarinAndroid仅在手机上将方向锁定为纵向【英文标题】:XamarinAndroidlockorientationtoportraitonphoneonly【发布时间】:2017-02-2114:53:32【问题描述】:我正在尝试将整个应用在手机尺寸布局上的方向锁定为仅纵向,但在平板电脑尺寸的... 查看详情

在 Android 上将视频和贴纸图片分享到 Instagram Story

】在Android上将视频和贴纸图片分享到InstagramStory【英文标题】:SharevideoandstickerImagetoInstagramStoryonAndroid【发布时间】:2018-12-0315:36:42【问题描述】:如何将视频作为背景和图像作为贴纸一起分享到Instagram快拍?如果两个内容都是... 查看详情

Firebase Firestore:如何在 Android 上将文档对象转换为 POJO

】FirebaseFirestore:如何在Android上将文档对象转换为POJO【英文标题】:FirebaseFirestore:HowtoconvertdocumentobjecttoaPOJOonAndroid【发布时间】:2018-03-2005:55:12【问题描述】:使用实时数据库,可以做到这一点:MyPojopojo=dataSnapshot.getValue(MyPojo.C... 查看详情

如何在Android Studio上将句子中的单词斜体?

】如何在AndroidStudio上将句子中的单词斜体?【英文标题】:HowtoitalicawordinsentenceonAndroidstudio?【发布时间】:2020-11-2606:50:26【问题描述】:我是开发Android应用的新手。我想把一些字变成斜体,但它不能正常工作。你能告诉我是否... 查看详情

在 Android 上将 getString 与 JSONObject 类一起使用时获取 null

】在Android上将getString与JSONObject类一起使用时获取null【英文标题】:GettingnullwhenusinggetStringwithJSONObjectclassonAndroid【发布时间】:2021-10-3010:59:00【问题描述】:我有以下代码:JSONObjectstudent2=newJSONObject();trystudent2.put("name","NAMEOFSTUDENT... 查看详情