0

我有一个自定义ListView,每个项目打开本地HTML文件(WebView)。 当我点击ListView项目到WebView时,我很难为转换添加动画。我尝试使用ActivityOptions.makeSceneTransitionAnimation()方法在startActivity()方法如下: -ListView项目扩展到WebViews - Transition Animation

MainActivity.java

public class MainActivity extends AppCompatActivity { 

ListView listView; 

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

    listView = (ListView) findViewById(R.id.list); 


    String[] values = new String[] { "LINK 1", 
      "LINK 2", "LINK 3" 
    }; 

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
      android.R.layout.simple_list_item_1, android.R.id.text1, values) { 
     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      View view = super.getView(position, convertView, parent); 
      if (position==0||position==1||position==2) { 
       view.setBackgroundColor(Color.parseColor("#BBDEFB")); 
      } else { 
       view.setBackgroundColor(Color.parseColor("#006064")); 
      } 
      return view; 
     } 
    }; 

    listView.setAdapter(adapter); 
    //final HashMap<String, Integer> hashMap = new HashMap<String, Integer>(); 



    **listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, 
           int position, long id) { 
      // TODO Auto-generated method stub 
      if (position == 0) { 
       Intent myIntent = new Intent(getApplicationContext(), 
         WebViewActivity.class); 
       myIntent.putExtra("key", 0); 
       startActivity(myIntent, ActivityOptions.makeSceneTransitionAnimation(this).toBundle()); 
      }else if (position == 1) { 
       Intent myIntent = new Intent(getApplicationContext(), 
         WebViewActivity.class); 
       myIntent.putExtra("key", 1); 
       startActivity(myIntent, ActivityOptions.makeSceneTransitionAnimation(this).toBundle() ); 
      }else if (position == 2) { 
       Intent myIntent = new Intent(getApplicationContext(), 
         WebViewActivity.class); 
       myIntent.putExtra("key", 2); 
       startActivity(myIntent); 
      }** 



     } 

    }); 

,但我得到了以下错误:

Error:(69, 60) error: no suitable method found for makeSceneTransitionAnimation(<anonymous OnItemClickListener>) 
method ActivityOptions.makeSceneTransitionAnimation(Activity,View,String) is not applicable 
(actual and formal argument lists differ in length) 
method ActivityOptions.makeSceneTransitionAnimation(Activity,Pair<View,String>...) is not applicable 
(actual argument <anonymous OnItemClickListener> cannot be converted to Activity by method invocation conversion) 

我全码:

WebViewActivity.java

public class WebViewActivity extends AppCompatActivity { 
WebView webView; 

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

    webView = (WebView) findViewById(R.id.webView1); 
    //webView.setWebViewClient(new myWebClient()); 
    webView.getSettings().setJavaScriptEnabled(true); 
    int pos = getIntent().getIntExtra("key", 0); 
    if (pos == 0) { 
     webView.loadUrl("file:///android_asset/index.html"); 
    } else if (pos == 1) { 
     webView.loadUrl("file:///android_asset/index2.html"); 
    } else if (pos == 2) { 
     webView.loadUrl("file:///android_asset/index3.html"); 
    } 

} 


} 

activity_main.xml中

`

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.example.a405146.listview.MainActivity"> 

    <ListView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/list" 
     android:layout_centerHorizontal="true" 
     android:layout_alignParentTop="true" 
     android:background="?android:attr/selectableItemBackground"/> 
</RelativeLayout> 

`

activity_web_view.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
tools:context="com.example.a405146.listview.WebViewActivity"> 

<WebView 
    android:id="@+id/webView1" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    /> 

</RelativeLayout> 

请帮我理解我出错的地方以及如何正确实施过渡。

回答

0

您需要为listView中的所有视图提供唯一的transitionName。您可以在调用getView时在适配器中执行该操作,调用setTransitionName并设置唯一的名称,例如某个字符串与每个项目唯一的当前位置的组合。写这样的事情getView方法

ViewCompat.setTransitionName(convertView, "list_item_"+position); 

内,在接下来的活动中,让你的WebView独特的transitionName也一样,“sharedWebView”。现在,当您开始下一个活动时,为该视图创建一个Pair对象,并在下一个活动中创建该视图的名称。事情是这样的

Pair<View, String> pair = Pair.create(view, "sharedWebView"); 

,并通过它,当你开始的活动,也是要传递到这里的内部类的引用,但你必须通过活动的参考。像这样的东西

startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(MainActivity.this, pair).toBundle()); 
+0

谢谢,我知道我应该从这个答案改变的想法! –