小编Yur*_*sap的帖子

ViewModel for Fragment而不是访问Activity ViewModel?

问题非常简单.问题在于使用ViewModels,LiveData和其他相关的生命周期感知的arch方法.
我有一个带有NavDrawer的Activity,可以在里面切换片段.
而且我有一个案例,当屏幕上同时出现两个片段时 - 这将是主要的痛苦.One Fragment有一个嵌套的ViewPager Fragments(不要问为什么).另一个片段只是在用户执行某些操作时从第一个获取信息.这只是通过共享活动视图模型来实现的.但是应用程序本身有很多业务逻辑,随着视图模型越来越大,视图模型越来越大.
我想问的是 - 不是收据或规则如何解决这个问题,或者可能是如何通过修复整个项目结构来解决这个问题.我想问一下建议如何将android.arch.lifecycle样式中的MVVM方法应用于我的用例.
我没有看到更复杂的东西,只是在Fragments之间共享Activity ViewModel.但很常见,那不是治愈方法. 在此输入图像描述

你在这里可以看到什么 - 实际上是一团糟.关键是所有人都在分享ActivityViewModel.来自FirstFragment的连接(聚合)意味着ViewPager内部FirstFragment正在启动,ChildFragments并且它们也在使用相同的ActivityViewModel(杀死我).因此,每个人都在使用一个共享的ViewModel.
我的建议是为每个Layer添加一个ViewModel.因此,Activity/Fragments/ChildFragments拥有自己的ViewModels.但是这里出现了什么 - 我们应该如何沟通呢?
可能的解决方案 :

  • 每个组件有两个ViewModel.一个ViewModel将处理/委托业务逻辑,另一个将进行通信.每个组件有两个视图模型 - 不太好,是吗?
  • 有旧的界面(请不!)
  • 其他解决方法 - 比如DB/SharedPrefs/Realm改变了监听器和事件总线(我太老了:()).

  • 你的解决方案!

我会说以上所有都打破了很多设计原则,所以我该怎么办?我该怎么走出这个烂摊子?这里有什么Uncle Bob或另一个superhero可以提供帮助吗?

PS - 好吧,创建UML或其他图表不是我的强项.对不起.
PPS - 我知道谷歌 样本.

android mvvm android-fragments kotlin android-architecture-components

14
推荐指数
3
解决办法
4851
查看次数

androidx.core:core-ktx:1.0.0小部件包丢失了

最近Android团队(主要是那些家伙)已经介绍过了androidx.core:core-ktx:1.0.0.我把它添加到我的项目中:

implementation 'androidx.core:core-ktx:1.0.0'
Run Code Online (Sandbox Code Playgroud)

尽管时间很短,但一切看起来都很酷 - 我找不到toast()方法.经过几分钟的研究后,我发现androidx.core.widgetktx lib中不再存在包.在Changelog文件中没有提到它.这有点奇怪,因为它在androidx.core:core-ktx:1.0.0-alpha1版本中.

BTW同样奇怪的行为适用com.google.android.material:material:1.0.0beta01我能够使用MaterialComponents-styles的地方,并且在发布版本中Android Studio无法解决它们. 像往常一样,玩Android Studio几小时后(使用diff lib版本和无效缓存),事情就恢复了正常.样式问题不再有效.

Soooo,问题是:

做了什么?我们是否有任何描述所有相关变化的最新文档?

android kotlin android-ktx androidx

11
推荐指数
1
解决办法
939
查看次数

永远不会为第一项调用OnPageSelected?

我遇到的问题是ViewPager没有为0项调用onPageSelected.代码示例:

public class PagerActivity extends ActionBarActivity implements ViewPager.OnPageChangeListener {

private static final String TAG = PagerActivity.class.getCanonicalName();

private ViewPager mViewPager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_pager);
    mViewPager = (ViewPager) findViewById(R.id.view_pager);
    mViewPager.setAdapter(new ViewAdapter());
    mViewPager.setOnPageChangeListener(this);
}

@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    Log.e(TAG, "position = " + position);

}

@Override
public void onPageSelected(int position) {
    Log.e(TAG, "selected page = " + position);

}

@Override
public void onPageScrollStateChanged(int state) {
    Log.e(TAG, "state = " + state);

}

private …
Run Code Online (Sandbox Code Playgroud)

java android android-viewpager

6
推荐指数
1
解决办法
1936
查看次数

填充视图的最佳方式

我正在开发自定义布局,它的属性很少。属性:

<declare-styleable name="CustomLayout"> //other attr... <attr name="data_set" format="reference"/> </declare-styleable>

数据集只是一个字符串数组,我根据它通过填充视图来填充我的布局:

private Option[] mOptions; // just an array for filing content

public CustomLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    TypedArray array = context
            .obtainStyledAttributes(attrs, R.styleable.CustomLayout);
    int arrayId = array.getResourceId(R.styleable._data_set, -1);
    if (arrayId != -1) {
        array = getResources().obtainTypedArray(arrayId);
        mOptions = new Option[array.length()];
        for (int index = 0; index < array.length(); index++) {
            mOptions[index] = new Option();
            mOptions[index].setLabel(array.getString(index));
        }
        populateViews();
    }

    array.recycle();
}

private void populateViews() {
    if …
Run Code Online (Sandbox Code Playgroud)

performance android

5
推荐指数
1
解决办法
93
查看次数